22

Java 7 以降では、ひし形を使用して、通常どおり問題なく型を推論できます。

List<String> list = new ArrayList<>();

ただし、次のような匿名の内部クラスには使用できません。

List<String> st = new List<>() { //Doesn't compile

    //Implementation here

}

どうしてこれなの?このシナリオでは、論理的には、タイプを として間違いなく推測できStringます。この決定には、匿名の内部クラスで型を実際に推論できないという論理的な理由がありますか、それとも他の理由で省略されましたか?

4

3 に答える 3

14

JSR-334では:

匿名の内部クラスでダイヤモンドを使用することはサポートされていません。これを行うと、一般に、クラス ファイルの署名属性を拡張して非表示型を表す必要があり、デファクト JVM の変更です。

私が推測しているのは、誰もが知っているように、匿名クラスは独自のクラス ファイルの生成につながるということです。

ジェネリック型はこれらのファイル内に存在せず、むしろ有効な(静的)型に置き換えられると思います(したがって<String>、宣言オブジェクト時のように明示的な型によって宣言されます)。

実際、内部クラスに対応するファイルは、その複数の異なるインスタンス間で共有されることはありません。:)。

コンパイラがこれらの種類のクラス ファイルに拡張を強制する (ジェネリックの特別な属性を追加することによって) ことは、ほとんど達成できません (そして確実に役に立ちません)。

于 2012-12-11T14:30:45.750 に答える
1

要するに、 は<>型を推測することはほとんどなく、それがなければ得られる警告をオフにします。

編集:@Natixが指摘しているように、いくつかのチェックを行います。

List<Integer> ints = new ArrayList<>();
List<String> copy = new ArrayList<>(ints);

コンパイルエラーを生成します

Error:Error:line (42)error: incompatible types
required: List<String>
found:    ArrayList<Integer>

ご覧のとおり、<>は引数の型を取得しており、型から型を推測していません。copy

于 2012-12-11T13:47:59.543 に答える