インターフェイスが適切に実装されていなくても、このクラスがコンパイルされるのはなぜですか?

ポール・リチャーズ:

それではリストはなぜコード(以下)がコンパイルされるのでしょうか?確かに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>にすることです(もちろん、私はこれよりも優れた名前を使用していますが、これは単なる例です)。

アンドレモニー:

答えはJLS 7 5.5.1にあります。参照タイプのキャスト

コンパイル時参照タイプS(ソース)とコンパイル時参照タイプT(ターゲット)が与えられた場合、以下のルールによるコンパイル時エラーが発生しない場合、キャスト変換はSからTに存在します。

Sがクラス型の場合:

If T is a class type, then either |S| <: |T|, or |T| <: |S|. Otherwise, a compile-time error occurs.

Furthermore, if there exists a supertype X of T, and a supertype Y of S, such that both X and Y are provably distinct parameterized types

(§4.5)、XとYの消去が同じである場合、コンパイル時エラーが発生します。

あなたの場合List<Integer>、そしてList<String>明らかに異なるパラメータ化されたタイプであり、それらは両方とも同じ消去を持っています:List

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

スーパークラスが、子によって実装されることになっているインターフェイスメソッドを実装するのはなぜですか?

分類Dev

F#でのこのインターフェイスの実装がコンパイルされないのはなぜですか?

分類Dev

2つのオブジェクトの両方がコンパイル時に指定されていない共通のインターフェイスを実装しているかどうかを判断することは可能ですか?

分類Dev

デストラクタが宣言されている場合、なぜこのコードはコンパイルされないのですか?

分類Dev

必要なヘッダーファイルがコメントアウトされているにもかかわらず、このC ++プログラムがコンパイルされて実行されるのはなぜですか?

分類Dev

インターフェイスで定義されたC#4オプションパラメーターがクラスの実装に適用されないのはなぜですか?

分類Dev

実装されたインターフェイスメソッドを「パブリック」として宣言する必要があるのはなぜですか?

分類Dev

クラスが子インターフェイスを実装しているのに、親は実装していないのはなぜですか?

分類Dev

別の構造体がメンバーとして共用体にラップされている構造体が、明示的なデフォルトコンストラクターなしでコンパイルされないのはなぜですか?

分類Dev

クラスがインターフェイスを実装するときに、ServletConfig objがGenericServletのinit()に渡されるのはなぜですか?

分類Dev

メインの前に関数が宣言されていなくても、このオンラインコンパイラでコードをコンパイルできるのはなぜですか?

分類Dev

PrimeNGが正しくインストールされていても、PrimeNGボタンクラスが機能しないのはなぜですか?

分類Dev

パッケージファイルのリストには、分散ファイルのみが含まれることになっていますか、それともランタイムで生成されたファイルも含まれていますか?

分類Dev

DataがComparatorインターフェースを実装しているときに、コンパイラーが比較不可能な要素を持つソートされたコレクションの構築に不満を言うのはなぜですか?

分類Dev

インターフェースを実装するクラスがJavaのインターフェースと同じ型としてカウントされないのはなぜですか?

分類Dev

プロファイラーが何も作成していないのに、char []インスタンスが多数表示されるのはなぜですか?

分類Dev

なぜこのコードはコンストラクターについて文句を言わずにコンパイルされるのですか?

分類Dev

このテンプレートクラスがコンパイルされないのはなぜですか?

分類Dev

この汎用インターフェイスを実装すると、あいまいな参照が作成されるのはなぜですか?

分類Dev

これは、コンストラクターのプロトタイププロパティがオブジェクトに設定されていないインスタンスのデフォルトの動作ですか?

分類Dev

コードで何も変更されていなくても、ターゲットが常に実行可能ファイルを再コンパイルするのはなぜですか?

分類Dev

複数のコンストラクターを使用するこのJavaコードがVSコードで実行されるのに、javacでコンパイルされないのはなぜですか?

分類Dev

インターフェイスが実装されないようにすることはできますか?

分類Dev

typescriptクラスによって実装されたことがないキーインターフェイス

分類Dev

このタイプがコンパイラによって推測されないのはなぜですか?

分類Dev

テストアセンブリパターンを配置しているにもかかわらず、テストアセンブリがVSTS Azureビルドパイプラインでフィルタリングされないのはなぜですか?

分類Dev

MutexクラスがWebpackによってトランスパイルされないのはなぜですか?

分類Dev

値コンストラクターには引数が与えられていなくても、コードはコンパイルされたままです。

分類Dev

変数がJavaのインターフェイス名で宣言されているのはなぜですか?

Related 関連記事

  1. 1

    スーパークラスが、子によって実装されることになっているインターフェイスメソッドを実装するのはなぜですか?

  2. 2

    F#でのこのインターフェイスの実装がコンパイルされないのはなぜですか?

  3. 3

    2つのオブジェクトの両方がコンパイル時に指定されていない共通のインターフェイスを実装しているかどうかを判断することは可能ですか?

  4. 4

    デストラクタが宣言されている場合、なぜこのコードはコンパイルされないのですか?

  5. 5

    必要なヘッダーファイルがコメントアウトされているにもかかわらず、このC ++プログラムがコンパイルされて実行されるのはなぜですか?

  6. 6

    インターフェイスで定義されたC#4オプションパラメーターがクラスの実装に適用されないのはなぜですか?

  7. 7

    実装されたインターフェイスメソッドを「パブリック」として宣言する必要があるのはなぜですか?

  8. 8

    クラスが子インターフェイスを実装しているのに、親は実装していないのはなぜですか?

  9. 9

    別の構造体がメンバーとして共用体にラップされている構造体が、明示的なデフォルトコンストラクターなしでコンパイルされないのはなぜですか?

  10. 10

    クラスがインターフェイスを実装するときに、ServletConfig objがGenericServletのinit()に渡されるのはなぜですか?

  11. 11

    メインの前に関数が宣言されていなくても、このオンラインコンパイラでコードをコンパイルできるのはなぜですか?

  12. 12

    PrimeNGが正しくインストールされていても、PrimeNGボタンクラスが機能しないのはなぜですか?

  13. 13

    パッケージファイルのリストには、分散ファイルのみが含まれることになっていますか、それともランタイムで生成されたファイルも含まれていますか?

  14. 14

    DataがComparatorインターフェースを実装しているときに、コンパイラーが比較不可能な要素を持つソートされたコレクションの構築に不満を言うのはなぜですか?

  15. 15

    インターフェースを実装するクラスがJavaのインターフェースと同じ型としてカウントされないのはなぜですか?

  16. 16

    プロファイラーが何も作成していないのに、char []インスタンスが多数表示されるのはなぜですか?

  17. 17

    なぜこのコードはコンストラクターについて文句を言わずにコンパイルされるのですか?

  18. 18

    このテンプレートクラスがコンパイルされないのはなぜですか?

  19. 19

    この汎用インターフェイスを実装すると、あいまいな参照が作成されるのはなぜですか?

  20. 20

    これは、コンストラクターのプロトタイププロパティがオブジェクトに設定されていないインスタンスのデフォルトの動作ですか?

  21. 21

    コードで何も変更されていなくても、ターゲットが常に実行可能ファイルを再コンパイルするのはなぜですか?

  22. 22

    複数のコンストラクターを使用するこのJavaコードがVSコードで実行されるのに、javacでコンパイルされないのはなぜですか?

  23. 23

    インターフェイスが実装されないようにすることはできますか?

  24. 24

    typescriptクラスによって実装されたことがないキーインターフェイス

  25. 25

    このタイプがコンパイラによって推測されないのはなぜですか?

  26. 26

    テストアセンブリパターンを配置しているにもかかわらず、テストアセンブリがVSTS Azureビルドパイプラインでフィルタリングされないのはなぜですか?

  27. 27

    MutexクラスがWebpackによってトランスパイルされないのはなぜですか?

  28. 28

    値コンストラクターには引数が与えられていなくても、コードはコンパイルされたままです。

  29. 29

    変数がJavaのインターフェイス名で宣言されているのはなぜですか?

ホットタグ

アーカイブ