4

コンパイラは <X,Y> を最終行に保持することを許可しません。その理由がわかりません。

このような一般的な構造をコンパイルするにはどうすればよいですか?

コードを次のように変更してみました。

 X a = new A<X,Y>(); // "Type mismatch: cannot convert from A<X,Y> to X" 
 Y b = new B<X,Y>(); // "Type mismatch: cannot convert from B<X,Y> to Y" 

 W<X,Y> s = new M<X,Y>(a,b); // no error

私は少し迷っています - 助けてください!

4

3 に答える 3

4

のコンストラクターはM< X, Y >と を受け取ることを期待してXYますが、 と を与えようとしていIA< X, Y >ますIB< X, Y >。必要な関係が逆になります。Xは ですが、IA< X, Y >その逆はありませんY

以下はコンパイルされますが、あなたが求めているものに対して十分に制限的ではないようです:

class A<X extends IA<X,Y>, Y extends IB<X,Y>> implements IA<X,Y>{}
class B<X extends IA<X,Y>, Y extends IB<X,Y>> implements IB<X,Y>{}
interface IA<X extends IA<X,Y>, Y extends IB<X,Y>> {}
interface IB<X extends IA<X,Y>, Y extends IB<X,Y>> {}

class M<X extends IA<X,Y>, Y extends IB<X,Y>> extends W<X,Y>{
    public M(IA<X,Y> x, IB<X,Y> y){} // this is the only change
}

class W<X extends IA<X,Y>, Y extends IB<X,Y>> {}


//To my check class code:

public <X extends IA<X,Y>, Y extends IB<X,Y>> void check() {
    IA<X,Y> a = new A<X,Y>();
    IB<X,Y> b = new B<X,Y>();

    W<X,Y> s = new M<X,Y>(a,b);
}
于 2012-07-13T06:49:17.277 に答える
1

問題には、意味をなさない多くの一般的な制約が含まれます。のコンストラクターは、ジェネリックメソッドの型パラメーターである型とM<X,Y>の引数を取ります(つまり、呼び出し元は何でも決定でき、これは引き続き機能する必要があります)。では、なぜあなたはそして(またはそれに関しては他の何か)が正しいタイプであると期待するのですか?XYcheckXYab

ジェネリックスの制約を変更して機能するようにする方法を知りたい場合は、コンパイルするはるかに単純なもの(ジェネリックスを変更するだけで(ただし、そのまま維持WMます)、他には何も変更しません)、おそらくこれに近いものです。とにかく欲しかった:

public interface IA<X, Y> {}
public interface IB<X, Y> {}

public class A implements IA<A,B>{}
public class B implements IB<A,B>{}

public class M<X extends IA<X,Y>, Y extends IB<X,Y>> extends W<X,Y>{
    public M(X x, Y y){}
}
public class W<X extends IA<X,Y>, Y extends IB<X,Y>> {}

//To my check class code:

public void check() {
    A a = new A();
    B b = new B();

    W<A,B> s = new M<A,B>(a,b);
}
于 2012-07-13T20:00:14.377 に答える
0

私はあなたがそれをしたくないのを見ました:

@SuppressWarnings("unchecked")
W<X,Y> s = new M<X,Y>((X) a,(Y) b);

動作します。

メンタル裁判官が述べたように、あなたの問題は抽象的すぎて、有意義な支援を提供することが困難です. たとえば、checkメソッドでは、 を作成してnew A<X,Y>()います。どういう意味ですか?Xと を定義しませんY。実際のコードでは、そのようなメソッドはありません。

于 2012-07-13T13:55:28.750 に答える