无法调用接受并返回特征中自引用参数化类型的对象的函数

时间:2011-07-26 16:03:02

标签: scala types

是否有人解释为什么以下调用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()和另一个是必需的类型,因此调用应该是成功的。这种推理有什么问题?

1 个答案:

答案 0 :(得分:4)

好问题。当您编写T <: Foo[_]时,它会转换为存在类型T <: Foo[X] forSome {type X}。 Scala编译器将X的实例称为_$1,以避免与现有符号名称冲突。在您的示例中,t1t2都有T类型。当您致电t1.foo时,您将t1视为Foo[_$1],因此预期参数的类型应为_$1。相反,编译器会找到类型为t2的{​​{1}},它不匹配。要解决此问题,必须在T:

上绑定一个更受约束的类型
T