/ / Wie kann eine Ganzzahl zu einer String ArrayList hinzugefügt werden? - Java, Arraylist

Wie kann eine Ganzzahl zu einer String ArrayList hinzugefügt werden? - Java, Arrayliste

List list = new ArrayList<String>() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);

Der obige Code hat eine Typreferenz Liste unter Bezugnahme auf eine Instanz von Anordnungsliste vom Typ Zeichenfolge. Wenn die Linie list.add(1) wird ausgeführt, wird nicht die 1 zur ArrayList hinzugefügt (vom Typ String)? Wenn ja, warum ist dies zulässig?

Antworten:

15 für die Antwort № 1

Sie haben die Typlöschung verwendet, dh Sie haben zuvor festgelegte generische Prüfungen ignoriert. Sie können damit umgehen, da Generics eine Funktion zur Kompilierungszeit sind, die zur Laufzeit nicht überprüft wird.

Wie hast du das selbe

List list = new ArrayList() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);

oder

List<Integer> list = new ArrayList<Integer>() ;
list.add(1) ;
Integer hello = list.get(0); // generics add an implicit cast here
System.out.println(hello);

Wenn Sie sich den vom Compiler generierten Bytecode ansehen, können Sie den Unterschied nicht feststellen.

Interessanterweise können Sie dies tun

List<String> strings = new ArrayList<String>();
@SuppressWarnings("unchecked");
List<Integer> ints = (List) strings;
ints.add(1);

System.out.println(strings); // ok
String s= strings.get(0); // throws a ClassCastException

12 für die Antwort № 2

Das Problem ist, dass dein list Variable hat einen rohen Typ und Sie können dieser Liste Objekte eines beliebigen Typs hinzufügen. Um das Problem zu lösen, deklarieren Sie es einfach als List von String"s:

List<String> list = new ArrayList<String>() ;

3 für die Antwort № 3

Es kompiliert da die Deklaration List list Verwendet den Rohtyp List, nicht der gebundene Typ List<String>. Die zweite Zeile wird kompiliert, weil Ihre list Variable kann alles annehmen. Die dritte Zeile wird kompiliert, weil list.get(0) kehrt zurück Object. Die vierte Zeile hat keinen Grund zu scheitern.

Aus Versehen hat nichts im kompilierten Code dazu geführt, dass die Ganzzahl 1 in a umgewandelt wurde String. Aber darauf dürfen Sie sich nicht verlassen. Wäre die erste Zeile die richtige gewesen?

List<String> list = new ArrayList<>();

Ihr Fehler wäre beim Kompilieren aufgefallen.


3 für die Antwort № 4

Wenn Sie eine Liste wie diese deklarieren: List list = new ArrayList<String>() ;

Sie verwenden einen so genannten Rohtyp. Es ist ein Typ mit einem generischen Typparameter wie List, aber Sie haben keinen angegeben. Wenn Sie die Compiler-Warnungen überprüfen, werden Sie darauf hingewiesen. Das Mischen von parametrisierten Typen mit Rohtypen wird im Allgemeinen als Programmierfehler angesehen. Das ist in Ordnung:

List<String> list = new ArrayList<String>() ;

und das ist ok (aber obsolet):

List list = new ArrayList();

Aber die Art, wie Sie es geschrieben haben, sollte vermieden werden.

Das Problem ist, dass Generika nur zur Compiler-Zeit überprüft werden und Sie dem Compiler davon erzählt haben Listnicht List<String>So können Sie alles hineinstecken, was Sie wollen! Die Tatsache, dass die rechte Seite den Parameter hat, bedeutet nicht wirklich etwas, es ist die Art der tatsächlichen Referenz, die für den Compiler von Bedeutung ist.


0 für die Antwort № 5
List list = new ArrayList<String>() ; // WARNING!!!

Eine unsichere Liste verweist auf eine sichere ArrayList

list.add(1) ;  // WARNING!!!

Eine Ganzzahl (in Ganzzahl umgerechnete Ganzzahl 1 ist Autoboxing) ist kein der Liste hinzugefügter String

Integer hello = (Integer) list.get(0) ;

Casting ist erforderlich, da unsichere Liste alles enthalten kann.

System.out.println(hello);

Integer.toString () aufgerufen

Wird bei der Ausführung der Zeile list.add (1) nicht die 1 zur ArrayList (vom Typ String) hinzugefügt?

Ja. Einer ArrayList, die String enthalten soll, wurde eine Ganzzahl hinzugefügt.

Wenn ja, warum ist das dann erlaubt?

Rückwärtskompatibilität. Java muss vorgenerische Codes unterstützen.

Liste Liste; bedeutet, dass es unsicher ist, sodass Sie alles damit machen können, und die angegebene ArrayList () muss dies tolerieren.

Moral: Ignorieren Sie die Compiler - Warnungen nicht, da sonst Integer in eine ArrayList eintreten kann, die Strings enthalten soll.


-1 für die Antwort № 6

Ja ... Array wird die 1 hinzugefügt, da Java wie andere Sprachen die implizite (automatische) Konvertierung (Casting) von primitiven Datentypen implementiert.

Mehr Informationen hier Conversions und Promotionen


-3 für die Antwort № 7

Versuche dies

List.add(Integer.toString(1));

Sie können dies auch versuchen

List list = new ArrayList<Object>() ;

Wenn es nicht erforderlich ist, muss die Arrayliste eine Arrayliste von String sein


-4 für die Antwort № 8

Nein, weil Java das sieht 1 als eine ganze Zahl. Sie müssen Ihre Zahl zuerst mit als String konvertieren Integer.toString(n)