Warum fügt (String) in einem ListInteger, der an einen List-Parameter übergeben wird, keine Ausnahme aus?

8

Warum ist es möglich, im folgenden Code ein String in ein List<Integer> einzufügen? Ich habe eine Klasse, die Zahlen in eine Liste von Ganzzahlen einfügt:

%Vor%

Dann habe ich eine separate Klasse, die ein String in ein List mit dem numerischen Zeichenfolgenwert "42" :

einfügt %Vor%

Warum löst der Compiler keinen Compilerfehler aus oder gibt die Laufzeitumgebung eine Laufzeitausnahme wie *CastException , wenn ich String der Liste der Ganzzahlen hinzufüge? Warum erzeugt System.out.print(list) eine Ausgabe wie die folgende ohne Ausnahmen?

%Vor%

Was ist der Grund dafür, dass all dies passieren kann?

    
java_user 30.01.2015, 13:27
quelle

2 Antworten

8

Dies ist wahrscheinlich ein Beispiel zur Veranschaulichung Typ löschen für Generika (ich empfehle diesen Link zu lesen, um dies vollständig zu verstehen und die entscheidende Rolle, die er in Java-Generika spielt).

  1. list wird als List<Integer> deklariert
  2. Wenn es als Argument an listValue übergeben wird, wird es in ein umgewandelt Rohtyp
  3. Von diesem Punkt an in dieser Methode hat das Programm zur Laufzeit keine Kenntnis davon, dass es ursprünglich eine "Liste von Integer" war, so dass es jedes Objekt ohne Ausnahme einfügen kann - innerhalb der Klassendeklaration wird die Typvariable in% gelöscht co_de%
  4. In der Hauptmethode ruft der Object -Befehl einfach print auf der Liste auf, was nichts dagegen hat, was er enthält, und so druckt er die Elemente einschließlich der Zeichenkette.

Wenn Sie eine Ausnahme sehen möchten, fügen Sie eine Zeile hinzu:

%Vor%

Dies wird einen toString als Compiler werfen, fügt während des Löschens Umwandlungen ein, wo dies notwendig ist, um die Typensicherheit zu schützen.

Umsetzungen von parametrisierten Typen wie ClassCastException auf den unformatierten Typ, wie List<Integer> , geben Ihnen eine Compiler-Warnung, um Ihnen zu sagen, dass genau diese Art von Problem bevorsteht geschehen. Sie können diese Warnung mit List (oder @SuppressWarnings("unchecked") , wenn dies der Fall ist) unterdrücken steht Ihnen zur Verfügung ). Dies ist eine gute Möglichkeit, "anzuerkennen", dass Sie etwas tun werden, was zu einer ungeprüften Laufzeitausnahme führt, und hilft auch anderen zukünftigen Programmierern zu sagen, dass etwas Unkonventionelles passieren könnte. Zum Beispiel:

%Vor%     
Andy Brown 30.01.2015, 13:35
quelle
0

Der Compiler wird

werfen
  

Ausnahme im Thread "main" java.lang.ClassCastException:   java.lang.String kann nicht in java.lang.Integer 234 um umgewandelt werden   com.performance.Main.main (Main.java:26)

, da Sie hier den Typ ArrayList<Integer>(); angegeben haben und wenn Sie eine Zeichenfolge list.add(new String("42"));

hinzufügen     
San Krish 30.01.2015 13:35
quelle

Tags und Links