2009-09-21 10 views
9

In Java wird die Map-Schnittstelle als definierteJava-Generics: Warum ignoriert Map.get() den Typ?

public interface Map<K,V> { 
    ... 
    V get(Object key); 
    ... 
} 

Warum nicht?

V get(K key); 

Ich stieß gerade in einen bösen Fehler, weil falscher Typschlüssel benutzt wurde. Ich dachte, der Zweck der Generika bestünde darin, den Typfehler früh während des Kompilierens abzufangen. Schafft das diesen Zweck?

+0

Einige gute Antworten finden Sie hier: [Was sind die Gründe, warum Map.get (Objektschlüssel) nicht (vollständig) generisch ist] (http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic) – NickDK

Antwort

9

Kevin Bourrillion blogged about this vor einer Weile. Zusammenfassung:

Einheitlich, Methoden der Java Collections Framework (und die Google Sammlungen Bibliothek zu) nie die Typen ihrer Parameter außer beschränken, wenn es notwendig ist die Sammlung von zu Bruch zu verhindern.

Persönlich bin ich kein Fan von diesem Ansatz, aber es macht einen Sinn angesichts der Varianz-Ansatz, der auch genommen wurde.

-3

Um @subtenante hinzuzufügen, ist Java so konzipiert, dass Java immer abwärtskompatibel ist. Generics verbieten Puts vom falschen Typ, da dies die Abwärtskompatibilität nicht beeinträchtigt. Der einfache Weg, um sicherzustellen, dass der richtige Schlüssel verwendet wird, ist dies zu tun.

K key = null; 
V value = null; 

Map<K,V> mapped = new HashMap<K,V>() 
.......//set the key and value.......... 
mapped.put(key, value) 
..... 
V var = mapped.get(key); 

Problem gelöst.
Noch ein Vorbehalt für Generika, jedes Kind einer Klasse kann auch in einer Sammlung platziert werden.

Number k= null; 
Number v= null; 

Map<Number,Number> mapped = new HashMap<Number,Number>() 
.......//set the key and value.......... 
k = double someDouble; 
v = int someInt; 
mapped.put(k, v) 
..... 

Dies könnte einige große Bugs verursachen !!

+0

Ich sehe wirklich nicht, wo Löschung in diese kommt. Löschen sollte nur ein Problem sein, wenn Sie etwas "unsicher" machen. –

+0

Put() verwendet Generics-Typen. Ich beschwere mich nur über bekommen. –

+0

@ZZ Coder, ich adressiert die Get in der oberen Reihe von Code, der zweite Satz von Code Ich wies auf ein anderes häufiges Problem einige haben Generika – WolfmanDragon

3

Ein Objekt eines Typs kann .equals() für ein Objekt eines anderen Typs sein. get() erfordert nur, dass das Objekt, das Sie es geben .equals() zu dem Schlüssel, den Sie erhalten

+0

Dies ist nicht wahr. Ich bekomme ClassCastException, damit der Typ übereinstimmen muss. –

+7

Wenn Sie eine ClassCastException erhalten, ist equals() schlecht implementiert. Es ist eine bessere Idee, false zurückzugeben, wenn die Typen inkompatibel sind. – finnw

Verwandte Themen