5

なぜこれがコンパイルエラーになるのか誰か教えてもらえますか? 2 番目の for ループで A にキャストすると、strings() が一般的なオブジェクトのリストを返す理由がわかりません。

import java.util.ArrayList;
import java.util.List;

public class E {

    public static void main(String[] args) {
        for (String s : new D().strings()) {
            System.out.println("s = " + s);
        }
        for (String s : ((A) new D()).strings()) {
            System.out.println("s = " + s);
        }
    }

    static class D extends A<C> {
    }

    static abstract class A<T extends B> {
        List<String> strings() {
            return new ArrayList<String>() {{
                add("Foo");
                add("Bar!");
            }};
        }
    }

    static class B {
    }

    static class C extends B {
    }
}

これはジェネリックの癖ですか?

ありがとう、クリスチャン

4

1 に答える 1

7

行で:

    for (String s : ((A) new D()).strings()) {

生の type にキャストしているAため、型引数の情報が失われます。Java では、未加工の型のメソッドまたはフィールドを使用すると、(パラメーター化されたすべての情報が利用可能であっても) 未加工の型になります。つまり、技術的に未加工の型または非パラメーター化です。SoはではなくA.string()生の型と見なされます。ListList<String>

JSL がセクション 4.8で指定するように:

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

于 2010-01-07T14:00:56.323 に答える