2015-01-08 21 views
5

を通過することなく、有界取得私は、コードの一部に出くわしています:ジェネリック型パラメータは、実数型

public static <K,V> HashMap<K,V> newHashMap() { 
     return new HashMap<K,V>(); 
} 

、我々はこのように、HashMapのインスタンスを作成するためにこれを使用することができます。

Map<String, List<String>> anagrams = newHashMap(); 

今質問は、必要な型(この場合はその(String, List<String>))を渡すことなく呼び出されるメソッドnewHashMapですが、それでも正しい型が作成されています。

私はK,Vは、コードの左側に言及されているタイプに囲まなっているか、ここで混乱している:さえに渡さず

Map<String, List<String>> 

newHashMap(); 

答えて

7

これはtype inferenceと呼ばれている。それは、(type引数を決定するために、各メソッドの呼び出しと対応する宣言を見て

Javaコンパイラの能力ですまたは引数)を使用して、呼び出しを適用可能にします。推論アルゴリズムは、th e引数と、可能であれば、結果が代入されるか、または返される型。最後に、推論アルゴリズムはすべての引数で動作する最も特殊な型を見つけることを試みます。

も参照してください:

6

それがあるためだこと正しいタイプの

オブジェクトのジェネリックをオブジェクトのタイプの一部として見るのはよくある間違いです。そうではない。コンパイルが完了すると、ジェネリックは完全に削除されます。これはtype erasureと呼ばれます。

Map<String,String>は、実際にはMapです。 <String,String>の部分は、コード内で正しく使用するためにコンパイラによってのみ使用されます。

2

Javaはジェネリックス情報を格納しません。コンパイラがあなたのコードで終わると、マップはHashMap<Object, Object>()に相当します。ジェネリックスでは、間違った型を関数に渡さず、自動的に(そして安全に)取り出したオブジェクトをキャストしないことをコンパイラが検証できるだけです。

作成するタイプに関係なく、常にObjectが保存されます。

あなたのメソッド(newHashMap())はマップを何もしません(要素を追加しようとしたようなものです)。この関数はあなたが選んだジェネリックパラメータで動作します。あなたはそれ内のオブジェクトの間違った種類を保存しようとしないでください。

関連する問題