7

別の (型付きの) クラスから継承された、型付きの List パラメーターを持つメソッドに問題があります。

シンプルにしましょう:

public class B<T> {
  public void test(List<Integer> i) {
  }
}

B クラスには役に立たないジェネリック T があり、test() は整数リストが必要です。

今私がする場合:

public class A extends B {
  // don't compile
  @Override
  public void test(List<Integer> i) {
  }
}

タイプ A のメソッド test(List) は、スーパータイプ メソッドをオーバーライドまたは実装する必要があります」というエラーが表示されますが、これは発生すべきではありません。

しかし、リストのタイプを削除することは機能します...ただし、クラスジェネリックには依存しません。

public class A extends B {
  // compile
  @Override
  public void test(List i) {

また、型付きリストを使用するために、以下の役に立たないジェネリックを定義します

public class A extends B<String> {
  // compile
  @Override
  public void test(List<Integer> i) {

B のジェネリックは test() リストの型に影響を与えるべきではありません。誰が何が起こっているのか考えていますか?

ありがとう

4

2 に答える 2

9

ジェネリック型ではなく、生の B 型を拡張しています。生のものには効果的にメソッドがありませんが、test(List<Integer> i)メソッドがありtest(List)ます。

生の型に切り替えると、型が入力されているかどうかに関係なく、すべてのジェネリックが生に置き換えられます。

正しく行うには、

 public class A<T> extends B<T>

これは、オーバーライドするメソッドを含むジェネリック型を使用B<T>します。

于 2012-06-28T13:39:13.863 に答える
1

ジェネリックなしでクラスの使用を削除すると (そして生で使用すると)、クラス メソッドのすべてのジェネリックが忘れられます。

この理由により、2番目のケースでジェネリック型を通知すると、それが機能します。

これ:

class T<G> {
   public void test(G g);
}

この場合:

class A extends T {
}

次のようになります。

class T {
   public void test(Object g);
}

これは、Google IO 2011 で発表された Java パズルで、ここでビデオを見ることができます

于 2012-06-28T13:37:33.427 に答える