13

a List then なぜコード (以下) がコンパイルされるのですか? 確かに? MyClass2を返す必要があります。List<Integer>

public class Main {
  public static void main(final String[] args) {
    MyClass myClass = new MyClass();
    List list = myClass.getList();
    System.out.println(list);
    System.out.println(list.get(0).getClass());

    MyClass2 myClass2 = new MyClass2();
    List list2 = myClass2.getList();
    System.out.println(list2);
    System.out.println(list2.get(0).getClass());
  }

  public interface Int1 {
    public List getList();
  }

  public interface Int2 extends Int1 {
    @Override
    public List<Integer> getList();
  }

  public static class MyClass implements Int2 {
    @Override
    public List<Integer> getList() {
      return Arrays.asList(1, 2, 3);
    }
  }

  public static class MyClass2 implements Int2 {
    @Override
    public List getList() {
      return Arrays.asList("One", "Two", "Three");
    }
  }
}

にしようとすると、List<String>「java: Main.MyClass2 は抽象的ではなく、Main.Int2 の抽象メソッド getList() をオーバーライドしません」というエラーが表示されることに気付きました。上記の例でこれが得られない理由がよくわかりません。

注: 私のプロジェクトの問題の解決策は、インターフェイス自体を一般的なものにすることですInt1<X>(もちろん、これよりも適切な名前を使用していますが、これは単なる例です)。

4

6 に答える 6

0

したがって、型消去に関連しているように見え、コンパイラエラーではなく警告を生成するようなものです。これは、以前に見た他のチェックされていない変換シナリオと似ていると思います。よく研究された回答の人々に感謝します。

于 2013-07-19T09:58:06.060 に答える