对于简单的情况A
and B
同时受到编译器的约束T
, IttayD 的回答 https://stackoverflow.com/questions/6117999/multiple-lower-type-bounds-in-scala/6120222#6120222工作正常:
def f[T, A <: T,B <: T](a:A, b:B) = List[T](a,b)
When A
and B
已经绑定在你的class Foo[A, B]
例如,您需要引入临时虚拟变量以使编译器完成此工作:
class Foo[A, B](a: A, b: B) {
def g[T, A1 >: A <: T, B1 >: B <: T] = List[T](a: A1, b: B1)
}
(为清楚起见:A1 >: A <: T
表示该类型A1
必须是超类型A
和一个子类型T
,而不是那个A
是两者的子类型A1
and T
.)
A1
and B1
此处的唯一目的是推断正确的类型T
。如果编译器必须推断它们,它们将解析为A1 = A
and B1 = B
, 进而T
作为最具体的类型,它是两者的超类A
and B
.
然而,编译器没有意识到的一件事是,通过传递性,我们同时拥有T >: A
and T >: B
,这直接来自于关于A1
and B1
。我们需要帮助解决类型归属问题。
Now, Product#productIterator
无法使用此技术,因为它是在我们甚至不知道的地方定义的A
and B
,或者具体子类中有多少个类型参数。