在与Scala合作很长一段时间之后,我认为我已经弄清楚所有关于类型推断的内容,但显然没有。我无法理解为什么编译器无法推断出下面案例的类型:
trait LowLevel[A]
trait HighLevel[L <: LowLevel[A],A]
class LowLevelImpl extends LowLevel[Int]
class HighLevelImpl extends HighLevel[LowLevelImpl,Int]
def method[H <: HighLevel[L,A],L <: LowLevel[A],A](t: H): H = t
val t1 = method(new HighLevelImpl) //type inference fails. won't compile with error:
//Error:(22, 15) inferred type arguments [A$A126.this.HighLevelImpl,Nothing,Nothing]
//do not conform to method method's type parameter bounds
//[I <: A$A126.this.HighLevel[T,C],T <: A$A126.this.LowLevel[C],C]
//lazy val t1 = method(new HighLevelImpl);}
// ^
val t2 = method[HighLevelImpl,LowLevelImpl,Int](new HighLevelImpl) //works fine.
在调用方法时我必须指定所有类型似乎是不必要的。我的意思是,在将HighLevelImpl
实例作为参数传递之后,并不是在3种类型中的任何一种中都有任何选择吗?我错过了什么?