3

これは、次のコードを少し変更した後にコンパイルするときに生成される不可解な「互換性のない型」エラーに関するものです。

これは、javac と IntelliJ の両方で問題なくコンパイルされる最小限のクラスの内容です。

public final class ChildClass extends ParentClass<Object> {
    public void method() {
        String value = stringList.get(0);
    }
}

class ParentClass<T> {
    protected final List<String> stringList = new ArrayList<String>();
}

を削除して最初の行を変更した後<Object>、javac でコンパイルすると、次のエラー メッセージが生成されます。

ChildClass.java:6: incompatible types
found   : java.lang.Object
required: java.lang.String
        String value = stringList.get(0);
                                     ^
1 error

IntelliJ コンパイラでも同様のエラー メッセージが生成されます。

変更後の結果のコードがあまり推奨されないことは理解していますが、依存するべきではないのに、なぜ文字列リストが影響を受けるのかはよくわかりませんT

4

1 に答える 1

2

Java 言語仕様 4.8 :

コンストラクター (§8.8)、インスタンス メソッド (§8.4、§9.4)、または非静的フィールド (§8.3) の型 M スーパークラスまたはスーパーインターフェイスから継承されていない生の型 C は、対応する生の型です。 C に対応するジェネリック宣言での型の消去に。

これは、生の型 (= 型パラメーターなしで使用されるジェネリック) のすべてのジェネリック メンバーが生と見なされることを意味します。

あなたの例を修正することができます:

public final class ChildClass extends ParentClass {
    public void method() {
        String value = stringList.get(0);
    }
}

class ParentClass<T> extends NonGenericGrandParent {
}

class NonGenericGrandParent {
    protected final List<String> stringList = new ArrayList<String>();
}
于 2013-06-27T10:56:38.960 に答える