2017-03-23 58 views
1
HashMap<Integer, String> hashMap = new HashMap<>(); 
hashMap.put(1, "aaa"); 
hashMap.put(2, "baa"); 
hashMap.put(3, "caa"); 
System.out.println(hashMap.get(false)); 

上記のコードはコンパイルされ、正常に動作...はnullとして出力を提供します。Javaのジェネリックは、HashMapのために得るにブール値を渡すことができない理由<整数、文字列>

私が理解しようとしているのは、私が見逃している間に起こっているオートバイのことです。コンパイル時にジェネリックが適用されると、getメソッドはそこでブール値を渡すことは許されません。

おかげ

+0

'boolean'は' Boolean'に自動ボクシングされます。あなたのコードは 'System.out.println(hashMap.get(Boolean)false));' –

+0

ありがとう@ElliottFrisch!ブール値は、それが動作するオブジェクトのサブクラスです。 –

答えて

2

はハッシュマップのget方法はpublic V get(Object arg0) {として定義されます。 これは、任意のオブジェクトをパラメータとして配置できることを意味します。このメソッドはジェネリックを使用しないので、パラメータはコンパイラによってチェックされません。

ここにはjavadocがあります。

0

あなたは基本的に...あなたが好きなのparamとして

ので
V get(Object key); 

とHashMapの

public V get(Object key) { 
    Node<K,V> e; 
    return (e = getNode(hash(key), key)) == null ? null : e.value; 
} 

を渡すことができるように真央imnplementationのソースコードは、パラメータとしてオブジェクトを取っています別のインスタンスをパラメータとして渡すと、メソッドはnullを返します

0

public class HashMap<K,V>getメソッドのシグネチャは、それが一般的なない

get(Object key) 

あります。だから、それはただbooleanではない、あなたは任意のオブジェクトを渡すことができますし、いくつかの出力を与える(または存在しない場合はnull)。


私はあなたが、それはこの種の署名だった場合、その後、あなたの操作は許可されません

get(K key) 

で、この署名を混乱していると思います。

0

Map.getは一般的な方法ではありません。そうすれば、ジェネリック以前のJavaとの比較可能性が維持されます。それが汎用である場合、互換性を維持するためには、すべての型がObjectと一致するため、古いメソッドを削除する必要があります。

関連する問題