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的限制吗? 编辑: 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的地方定义,或者确实在具体子类中有多少个类型参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |