1

私はクラス階層の下にあります。

ファーストクラス

class First<T> {
}

セカンドクラス

class Second<T> extends First<T> {

}

サードクラス

class Third<T extends First<T>> {
}

エラー行:

Third<Second<String>> name = new Third<Second<String>>();//Compilation error

Bound mismatch: The type Second<String> is not a valid substitute for the bounded parameter <T extends First<T>> of the type Third<T>

上記のエラーで本当に混乱しています。このコンパイルエラーが発生する理由を教えてください。

4

3 に答える 3

2

T extends First<T>Second<String>T はStringと を拡張するものの両方にバインドされているため、 は と同じではありませんFirst<T>

サードで別のパラメーターを使用したいような気がします。

class Third<T extends First<?>> {
}
于 2012-09-18T11:07:13.267 に答える
1

Augusto は正しい方向に進んでいますが、ワイルドカードの使用を避けるため?に、クラスに別の型パラメーターを追加できますThird

class Third<U, T extends First<U>> {
    // ...
}

Third<String, Second<String>> name = new Third<>();

欠点はString、型引数で 2 回言及する必要があることです。

于 2012-09-18T11:54:12.590 に答える
0

あなたの割り当ての混乱は、in がTinSecondであるということです。したがって、割り当てが有効であるためには、を拡張する必要があります。しかし、extendsの場合はそうではありません。次のコードは期待どおりにコンパイルされます。StringTThirdSecond<String>Second<String>First<Second<String>>Second<String>First<String>

public class Test {

   static class First<T> {
   }

   static class Second<T> extends First<Second<T>> {
   }

   static class Third<T extends First<T>> {
   }

   public static void main(String... args) {
      Third<Second<String>> name = new Third<Second<String>>();
   }
}
于 2012-09-18T11:42:06.767 に答える