加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的多个下限类型

发布时间:2020-12-16 09:11:15 所属栏目:安全 来源:网络整理
导读:我注意到,tuple.productIterator总是返回一个Iterator [Any],如果不可能设置多个下限(因此它可以是最低的常见超类型的迭代器). 我尝试了一下,但是只发现了多个上限的this个问题. 这是我测试如何定义迭代器的类型: def f[A,B](a:A,b:B) = List(a,b)// return
我注意到,tuple.productIterator总是返回一个Iterator [Any],如果不可能设置多个下限(因此它可以是最低的常见超类型的迭代器).

我尝试了一下,但是只发现了多个上限的this个问题.

这是我测试如何定义迭代器的类型:

def f[A,B](a:A,b:B) = List(a,b)
// return type is List[Any]

def f[A,B,T >: A "and" T >: B](a:A,b:B) = List[T](a,b)
// doesn't compile,but
//  f(1,true) should give a List[AnyVal] and
//  f("x","y") a List[String]

这是JVM的限制吗?

编辑:
这是一个稍大一点的例子,当T应该在方法中定义时,它似乎不能使用IttayD方法来解决:

class Foo[A,B](a: A,b: B) {
  def f[T >: A] = List[T](a) // works
  def g[T >: A "and" T >: B] = List[T](a) // doesn't work
}

解决方法

对于A和B与编译器绑定在一起的简单情况,IttayD’s answer工作正常:

def f[T,A <: T,B <: T](a:A,b)

当A和B已经绑定在您的类Foo [A,B]示例中时,您需要引入临时虚拟变量以让编译器执行此作业:

class Foo[A,b: B) {
  def g[T,A1 >: A <: T,B1 >: B <: T] = List[T](a.asInstanceOf[T],b.asInstanceOf[T])
}

(为了清楚起见,A1>:A<:T表示A1类型必须是A的超类型和T的子类型,而不是A是A1和T的子类型) A1和B1仅用于推断T的正确类型.如果编译器必须推断它们,则它们将解析为A1 = A和B1 = B,然后T作为最特定的类型,它是超类A和B. 编译器没有意识到的一件事是,通过传递性,我们具有T>:A和T>:B,其直接来自关于A1和B1的约束.所以我们必须在这里明确提出.但在这里,演员总是安全的.

现在,Product#productIterator不能使用这种技术,因为它在我们甚至不知道A和B的地方定义,或者确实在具体子类中有多少个类型参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读