2016-08-08 7 views
-3

Im folgenden Beispiel habe ich versucht, eine generische Ref hm Bezug auf neu erstellt HashMap mit Typ <Integer,Integer>. Aber selbst wenn ich String-Werte durch hm Verweis hinzufügen, ist es zulässig. Wenn ref z. hm1 darunter ist nur zur Kompilierzeit Fehler geworfen.Was ist die Verwendung von generischen Deklaration in Objektdeklaration (zB HashMap <Integer, Integer>)

HashMap hm = new HashMap<Integer,Integer>(); 
hm.put("hello", "HashMap"); // why it is allowing even if the object created passed <Integer,Integer> else what is significance of <Integer,Integer> on object declaration 

HashMap <Integer,Integer> hm1; 
hm1 = hm; 
hm1.put("adfasf", "adff"); // throws error 

Also meine Frage ist, warum ist es so dass Elementtyp unterschiedliche Daten, die auch hinzufügen, wenn das Objekt übergeben erstellt <Integer,Integer> sonst was ist Bedeutung <Integer,Integer> auf Objektdeklaration?

+2

Wenn Sie Ihre Frage stellten, gab es eine große orange ** Wie mit nützlichen Informationen darin ** Feld rechts von dem Textbereich zu formatieren. Es gab auch eine komplette Symbolleiste mit Formatierungshilfen. Und eine ** [?] ** -Taste mit Formatierungshilfe. * Und * einen Vorschaubereich zwischen dem Textbereich und dem Post Your Question-Button (so dass Sie darüber scrollen müssen, um den Button zu finden, um Sie dazu anzuregen, ihn anzuschauen) und zeigen, wie Ihr Beitrag aussehen würde, wenn er gepostet wird .Wenn Sie Ihren Beitrag klarstellen und zeigen, dass Sie sich die Zeit genommen haben, verbessern Sie Ihre Chancen, gute Antworten zu erhalten. –

+1

Sie werfen einen Rohtyp, also sind alle Generika verloren. – 4castle

+0

'HashMap hm;' - Sie haben keine Referenztypen. –

Antwort

2
HashMap hm = new HashMap<Integer,Integer>(); 
hm.put("hello", "HashMap"); 

Generics in Java passieren nur zur Kompilierzeit, sie haben absolut keine Auswirkungen zur Laufzeit.

Dies bedeutet, dass zur Laufzeit ein HashMap<String, String> die gleiche Art von Objekt ist wie ein HashMap<Integer, Integer>.

Alles, was Generika tun ist, den Compiler sagen die deklarierten Typen für geistige Gesundheit zu überprüfen (und aus historischen Gründen das Opt-in, können Sie Generika weglassen).

In Ihrem Beispiel der Typ der Variablen ist nur die rohe Art HashMap (ohne generische Typen). Daher führt der Compiler keine Typprüfungen für Schlüssel oder Werte durch. (Und Sie werden eine Warnung davor bekommen haben).

HashMap <Integer,Integer> hm1; 
hm1.put("adfasf", "adff"); // throws error 

Was hm Gegensatz Ihre hm1 die generische Typen hat, und der Compiler wird es überprüfen.

Beachten Sie, dass es nicht „wirft einen Fehler“, wenn (das eine Laufzeit Sache sein würde), aber es funktioniert nicht nur zu kompilieren. Wenn Sie diesen Code kompilieren, wird er ohne Fehler ausgeführt (wie Sie festgestellt haben, als Sie auf dasselbe Objekt über hm zugegriffen haben). Sie würden nur dann eine Fehlermeldung erhalten, wenn Sie versucht haben, wieder eine Ganzzahl aus Ihrer Map zu entfernen (weil die Typumwandlung zur Laufzeit fehlschlagen würde).

+0

Danke. Aber was nützt es dann, generics in 'new HashMap ()' – Harish

+0

zuzulassen. So erhalten Sie einen Fehler, wenn Sie Dinge wie 'Map h1 = new HashMap () '. Der Compiler wird das ablehnen. Was du geschrieben hast, wird auch eine Warnung erzeugen. – Thilo

+1

Es ist wahr, dass 'new HashMap ()' ein wenig überflüssig ist, wenn Sie auch die Typen auf der linken Seite haben. Deshalb können Sie in Java stattdessen 'new HashMap <>()' schreiben. Beachten Sie, dass es immer noch den "Diamanten" enthält. Es ist kein Rohtyp, sondern der abgeleitete generische Typ. – Thilo

2
HashMap hm = new HashMap<Integer,Integer>(); 
hm.put("hello", "HashMap"); // why it is allowing even if the object created passed <Integer,Integer> else what is significance of <Integer,Integer> on object declaration 

Da hmHashMap eingegeben wird, nicht HashMap<Integer, Integer>. Sie haben ihm einen HashMap<Integer, Integer> zugewiesen, aber nur seinen Typ als HashMap. Da HashMap jedes Objekt für Schlüssel und Wert akzeptiert, sind Zeichenfolgen akzeptabel und der Code wird kompiliert. (Es läuft auch, weil der Typ Löschung.)

HashMap<Integer,Integer> hm1; 
hm1 = hm; 
hm1.put("adfasf", "adff"); // throws error 

Das kompilieren schlägt fehl, weil Sie die Compiler gesagt haben, was hm1 enthalten wird; Der Typ von hm1 ist HashMap<Integer, Integer>, nicht nur HashMap, und so weiß der Compiler, dass das Einfügen von Strings nicht in Ordnung ist.

Verwandte Themen