无法弄清楚为什么这是错误的或如何解决它。这是重现问题的“蒸馏”代码。请帮忙,但我不会欣赏任何“为什么”问题 - 有非常真实和有效的答案,但它们是专有且不可更改的,因此与解决方案无关。
object Sandbox {
// --- Following are really Java interfaces/classes ---
trait R[X <: U[X,Y], Y <: E[X,Y]];
class U[X <: U[X,Y], Y <: E[X,Y]] extends R[X,Y];
class E[X <: U[X,Y], Y <: E[X,Y]] extends R[X,Y];
trait R2 extends R[U2,E2];
class U2 extends U[U2,E2] with R2;
class E2 extends E[U2,E2] with R2;
// --- End Java interfaces/classes ---
def trouble[X <: U[X,Y], Y <: E[X,Y], Z <: R[X,Y]](r: Z) {}
def main(args: Array[String]) {
trouble(new U()); // Fine
trouble(new E()); // Fine
trouble(new U2()); // Not fine, reports:
/*
* inferred type arguments [Nothing,Nothing,Sandbox.U2]
* do not conform to method trouble's type parameter bounds
* [X <: Sandbox.U[X,Y],Y <: Sandbox.E[X,Y],Z <: Sandbox.R[X,Y]]
*/
trouble(new E2()); // Not fine, reports:
/*
* inferred type arguments [Nothing,Nothing,Sandbox.E2]
* do not conform to method trouble's type parameter bounds
* [X <: Sandbox.U[X,Y],Y <: Sandbox.E[X,Y],Z <: Sandbox.R[X,Y]]
*/
trouble[U2,E2,R2](new U2()); // Fine
trouble[U2,E2,R2](new E2()); // Fine
}
}
编译器似乎无法仅基于指定的单个参数来推断“麻烦”方法的 X、Y 和 Z 类型参数。我明白这一点 - 当我指定类型时,没关系,但它很麻烦。有没有办法以某种方式轻推/帮助编译器,以使这不再是一个问题?
也许我对 Scala 的类型推断系统过于自信,但它可以使用所有信息。
提前致谢!