键入推断令人惊讶的行为

时间:2014-03-04 11:38:40

标签: scala

假设我定义了以下类

class X[K, T](create: K => T) {

}

然后我定义了以下内容:

class A {

    val cb = new X[Int, B](i => new B(i))  // infers type fine
    val cc = new X[Int, C](i => new C(0, i))  // cannot infer type and requires parameter type

    class B(i: Int) {}

    class C(i1: Int, i2: Int) {}
}

我想知道为什么编译器无法在创建cc时推断i的类型?

由于 DES

2 个答案:

答案 0 :(得分:3)

我认为这是一个错字:

val cc = new X[Int, C](i => new C(0, i))

使用new X[Int, B](i => new C(0, i)),您告诉编译器X类型为X[Int, B],而是将构造函数参数create提供为=> C(应为=> B 1}})。

因此,它会抛出一个预期B的错误,但您提供了C

答案 1 :(得分:0)

我认为错误消息不正确。 C不是B的子类型,因此除非X[Int, B]扩展C,否则无法使用新的C()实例化B

例如,此代码可以正常工作:

class A {

  val cb = new X[Int, B](i => new B(i)) 
  val cc = new X[Int, B](i => new C(0, i))

  class B(i: Int) {}

  class C(i1: Int, i2: Int) extends B(i1){}
}