具象クラスは、一般的な識別子を使用してコンパイルされません

キーラン:

私は、このコンパイルエラーで困惑しています。以下のコードを考えてみましょう、ConcreteClass1次のコンパイル・エラーがあります。

エラー:(16、28)のjava:互換性のない型:java.util.Map java.lang.Stringで、java.lang.Stringで> java.util.Map java.lang.Stringで、java.lang.Object上位に変換することはできません>

しかし、ConcreteClass2それが伸びるという理由だけで、正常にコンパイルAbstractClassするのではなくAbstractClass<Object>どうしてこれなの?

abstract class AbstractClass<T extends Object> {

    void testGenerics(Map<String, Object> map) {
    }
}

class ConcreteClass1 extends AbstractClass<Object> {

    public void testGenerics() {
        Map<String, String> map = new HashMap<>();
        super.testGenerics(map);
    }
}

class ConcreteClass2 extends AbstractClass {

    public void testGenerics() {
        Map<String, String> map = new HashMap<>();
        super.testGenerics(map);
    }
}
チャールズDowbecki:

ConcreteClass2省略ジェネリックinforamtionによる生タイプとして宣言されています。あたりとして公式生タイプチュートリアル

(そのようなコレクションクラスなど)APIクラスの多くは、以前のJDK 5.0への一般的ではなかったので、生タイプは、レガシーコードに表示されます。生タイプを使用するときは、基本的に前のジェネリック医薬品の動作を取得します

上記のためtestGenerics(Map<String, Object> map)と解釈されtestGenerics(Map map)、それは任意で呼び出すことができるMapオブジェクト。前のJava 5のコードとの後方互換性のためにすべて。

あなたは見てとることができJLS 4.8生タイプ

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=203872&siteId=1