假设我定义了以下类
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
答案 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){}
}