是否有人解释为什么以下调用foo()是非法的并返回错误:
trait Foo[T<:Foo[_]] {
def foo(t: T): T
def test_foo(t1: T, t2: T): T = {
// produces error:
// type mismatch;
// found: t2.type (with underlying type T)
// required: _$1 where type _$1"
t1.foo(t2)
}
}
从人的角度来看应该没问题,因为我们有一个接受类型T并返回类型T的函数。然后我们有两个类型为T的对象t1和类型为T的t2。其中一个对象有方法.foo()和另一个是必需的类型,因此调用应该是成功的。这种推理有什么问题?
答案 0 :(得分:4)
好问题。当您编写T <: Foo[_]
时,它会转换为存在类型T <: Foo[X] forSome {type X}
。 Scala编译器将X
的实例称为_$1
,以避免与现有符号名称冲突。在您的示例中,t1
和t2
都有T
类型。当您致电t1.foo
时,您将t1
视为Foo[_$1]
,因此预期参数的类型应为_$1
。相反,编译器会找到类型为t2
的{{1}},它不匹配。要解决此问题,必须在T:
T