Generic javaコレクション、特にMapについて質問があります。get(Object key)
パラメータ(通常はキー)を必要とするget、contains、および同様のメソッドは、パラメータとしてObjectを取りますが、たとえば、期待するのではなく、クラスKの何かを受け取ることを期待していましたget(K key)
。誰かがこれの理由を説明できますか?
2 に答える
2
ここにあるように、取得するために渡すオブジェクトは、取得しようとしているキーのタイプと同じである必要はないためです。
唯一の条件は、それらのequals
メソッドがを返すことtrue
です。
編集:ピーターローリーが指摘したようにhashcode
、は同じである必要があります。
于 2012-09-19T14:06:19.857 に答える
0
主な問題は下位互換性です。
あなたがそれがうまくいかないことを「知っている」としても、次のことを試みることは常に可能でした
Map map = new HashMap();
map.put("hello", "world");
Object o = map.get(1); // null
boolean b = map.contain(2); // false
boolean b2 = map.remove(3); // false
null
結果として、これらのメソッドは、ジェネリックが常にまたはを返すことを意味している場合でも、任意の型をとることができる必要がありますfalse
。
また、キーが同じタイプである必要はなく、trueに等しい、同じhashCodeを持つ、またはcompareTo()==0であるTreeMapを構築することも可能です。
Map map = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return String.valueOf(o1).compareTo(o2.toString());
}
});
map.put("1", "one");
map.put(2, "two");
map.put(3L, "three");
map.put('4', "four");
for(Object o: new Object[] { 1L, '2', 3, "4"}) {
System.out.println(o.getClass().getSimpleName()+" "+o+" => "+map.get(o));
}
プリント
Long 1 => one
Character 2 => two
Integer 3 => three
String 4 => four
于 2012-09-19T14:06:19.420 に答える