Initialisieren ArrayList<Länge>
Warum kann ich initialisieren ArrayList, wie diese:
ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));
Bekam aber Fehler bei der Verwendung:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
zahlen standardmäßig int sind, so dass, wenn java versucht zu auto-box 1 und 2 wird es in wrapper-Typ Integer " und "Integer" ist nicht das gleiche, oder jeder, wie im Zusammenhang mit Lange
1,2 sind int-Werte und keine longs
Arrays.asList(1L, 2L)
1,2 sind int-Werte und keine longs
InformationsquelleAutor Luke | 2017-10-04
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erklärung
Java automatisch wandelt
int
zulong
wenn nötig.Jedoch, Java nicht das gleiche tun wenn eine transformation von
Integer
zuLong
benötigt wird.Die Funktion
Arrays.asList(...)
gibt eineList<E>
mitE
wobei der Typ als Parameter verwendet. Wie verwenden Sie1, 2, 3
der Typ istint
. Jedoch ist die generische Verwendung von Daten-Typen alsList<int>
ist nicht möglich in Java (zumindest momentan). Daher ist es automatisch wandeltint
zuInteger
und produziert eineList<Integer>
Objekt. Dieser Vorgang wird als auto-boxing, Java kann dies für alle Daten-Typen zu den entsprechenden Objekt-Darstellung.Wenn du nun den Konstruktor verwenden
new ArrayList<Integer>(List<E> list)
es erwartetE
etwas gebenInteger
. So einList<Integer>
arbeitet als Eingang.Aber wenn Sie
new ArrayList<Long>(List<E> list)
offensichtlichE
muss der TypLong
. Aber das ObjektInteger
ist nicht der TypLong
so tut es nicht akzeptieren der parameter. Die ersten gemeinsamen Art vonInteger
undLong
ist die abstrakte KlasseNumber
(die auch hältDouble
,Float
und andere) (Dokumentation).Lösung
Also es dreht sich alles um den Eingang
1, 2, 3
interpretiert alsint
stattlong
. Sie können dieses Problem beheben, indem explizit erzählen Java interpretieren die zahlen alslong
, so tun Sie dies durch Anhängenl
oderL
nach der Anzahl:Nun erhalten Sie eine
List<Long>
die dann Hinzugefügt wird, um eineArrayList<Long>
.Beachten Sie, dass die gleiche Technik kann verwendet werden, um explizit zu deuten Dezimalzahlen als
float
stattdouble
:1.5F
oder1.5f
asList
gibt eine benutzerdefinierte Feste GrößeArrayList
und nichtjava.util.ArrayList
.Du hast Recht, wusste nicht, dass. Werde ich entfernen, der Hinweis aus der Antwort, denn es ist nicht sinnvoll, dass dann.
InformationsquelleAutor Zabuza
Weil
1
und2
sind ints undArrays.asList(1, 2)
schafft eineList<Integer>
.Und der copy-Konstruktor von
ArrayList
erfordert die Argumente des gleichen generischen Typs.Haben Sie mehrere Optionen, aber die einfachste ist die änderung der
int
s inlong
s durch hinzufügen einerL
suffix:Beachten Sie, dass mit Java-9 kann man auch schreiben:
Arrays.asList
in, es gibt eine unveränderliche Liste - wenn Sie möchtenx
zu veränderlich, müssen Sie noch die Kopie-Konstruktor.Nur um Mißverständnisse zu vermeiden - ich bin mir bewusst, dass die zurückgegebene Liste von
Arrays.asList
ist veränderlich, aber Feste Größe. Die Antworten zu den diese Frage könnte auch von Interesse sein, für die zukünftigen Leser.InformationsquelleAutor assylias
Müssen Sie angeben, ein
Long
- Nummer mit literall
oderL
.InformationsquelleAutor Nikolas
Weil
Arrays.asList(1,2)
wird implizit eine RückkehrList<Integer>
.Können Sie beheben dies, indem Sie das folgende idiom:
InformationsquelleAutor Mena