2016-05-19 5 views
0

(用事:) それは違法です: HashSet<> f; タイプを指定せずにタイプを推論できないときにジェネリックオブジェクトを作成するのはなぜですか?

それは法的です:new HashSet<>();

型推論のドキュメントから:

あなたはジェネリックのコンストラクタ を呼び出すために必要な型引数を置き換えることができますコンパイラが型引数をコンテキストから推測できるように、タイプパラメータ(<>)が空の場合、 と長いクラスを持つクラス

しかし、コンパイラは2番目の例では型引数を推論できません。なぜコンパイルするのですか?

+1

_ジェネリッククラスのコンストラクタを呼び出すために必要な型引数を空の型パラメータセットに置き換えることができます。これは、最初のスニペットでやっていることではありません。 –

+1

また、これは推論できます。これは 'Object'を推論します。型推論の規則は非常に長いですが、それは '新しいHashSet <>()'が減らすものです。 –

+0

2番目の例では、コンパイラが型引数を推論できないという印象はありますか? –

答えて

1

Genericsはコンパイル時の構造です。つまり、特定の変数またはメソッドが特定の型または型のセットでのみ機能することを強制するために使用されます。あなたのケースでは、HashSetが割り当てまたは返却されていないので、コンパイラは最も広い型 - Objectを "推論"することができるので、型はコンパイル時に決して使用されません。そして実行時には、タイプはtype erasureのため意味がありません。

関連する問題