なぜこれが間違っているのか、それを解決する方法がわかりません。これが問題を再現する「蒸留された」コードです。助けてください、しかし私は「なぜ」の質問のどれにも感謝しません-それに対する非常に現実的で有効な答えがありますが、それらは独占的で変更できないので、解決策とは無関係です。
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タイプの引数を推測できないようです。私はそれだけ理解しています-タイプを指定するとき、それはOKですが、それは非常に面倒です。これが問題にならないように、何らかの方法でコンパイラを微調整/支援する方法はありますか?
たぶん私はScalaの型推論システムにあまりにも自信を持っていますが、すべての情報が利用可能です。
前もって感謝します!