In Java könnten wir Folgendes tun
public class TempClass {
List<Integer> myList = null;
void doSomething() {
myList = new ArrayList<>();
myList.add(10);
myList.remove(10);
}
}
Aber wenn wir es wie unten beschrieben direkt in Kotlin umschreiben
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
Ich habe den Fehler erhalten, dass meine Liste nicht gefunden wurde add
und nicht remove
funktioniert
Ich arbeite daran, es in ArrayList umzuwandeln, aber das ist seltsam, wenn man es umwandeln muss, während in Java kein Casting erforderlich ist. Und das macht den Zweck der abstrakten Klassenliste zunichte
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
(myList!! as ArrayList).add(10)
(myList!! as ArrayList).remove(10)
}
}
Gibt es eine Möglichkeit für mich, List zu verwenden, ohne sie umwandeln zu müssen, wie dies in Java möglich ist?
collections
kotlin
Elye
quelle
quelle
myList = null
und später beim Hinzufügen ohne hinzufügen!!
. Sie können dies überwinden, indem Sie daslateinit
Schlüsselwort vor Ihrer Eigenschaft folgendermaßen verwenden: Auflateinit var myList: List<Int>
diese Weise müssen Sie die Liste nicht sofort initialisieren, sondern garantieren dem Compiler, dass Sie sie initialisieren, bevor Sie die Liste zum ersten Mal verwenden. Es ist eine reibungslosere Lösung, aber Sie als Entwickler sind dafür verantwortlich.Antworten:
https://kotlinlang.org/docs/reference/collections.html
Sie müssen eine
MutableList
Liste verwenden.MutableList<Int> = arrayListOf()
sollte auch funktionieren.quelle
Definieren einer Listensammlung in Kotlin auf verschiedene Arten:
Unveränderliche Variable mit unveränderlicher (schreibgeschützter) Liste:
Unveränderliche Variable mit veränderlicher Liste:
oder ohne Anfangswert - leere Liste und ohne expliziten Variablentyp:
users.add(anohterUser)
oderusers += anotherUser
(unter der Haube ist esusers.add(anohterUser)
)Veränderbare Variable mit unveränderlicher Liste:
oder ohne Anfangswert - leere Liste und ohne expliziten Variablentyp:
users += anotherUser
- * Es erstellt eine neue ArrayList und weist sie zuusers
Veränderbare Variable mit veränderlicher Liste:
oder ohne Anfangswert - leere Liste und ohne expliziten Variablentyp:
users.add(anohterUser)
users += anotherUser
Siehe auch: https://kotlinlang.org/docs/reference/collections.html
quelle
Stimmen Sie allen oben genannten Antworten zur Verwendung von MutableList zu, aber Sie können auch eine Liste hinzufügen / daraus entfernen und eine neue Liste wie unten erhalten.
Oder
quelle
Anscheinend ist die Standardliste von Kotlin unveränderlich. Um eine Liste zu haben, die sich ändern könnte, sollte man MutableList wie folgt verwenden
Aktualisiert Dennoch ist es nicht empfehlenswert MutableList zu verwenden , es sei denn , für eine Liste , dass Sie wirklich ändern möchten. Bezieht sich auf https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359, um zu erfahren, wie die schreibgeschützte Sammlung eine bessere Codierung bietet.
quelle
MutableList
, aber das Initialisieren mitnull
funktioniert nicht. Auf einem vom Typ nullbaren Empfänger sind nur sichere oder nicht null-bestätigte Anrufe zulässigMutableList<Int>
.doSomething
lateinit
anstatt die Liste auf Null zu setzen, ist der richtige Weg, um dieses Problem zu lösen . Ich erinnere mich nicht, oblateinit
es von Anfang an zu Kotlin hinzugefügt wurde, aber dies ist heutzutage definitiv die Lösung, um es zu verwenden :-)In Kotlin müssen Sie
MutableList
oder verwendenArrayList
.quelle
Sie können so ein neues erstellen.
Jetzt können Sie list2 verwenden. Danke.
quelle
https://kotlinlang.org/docs/reference/collections.html
Laut obigem Link ist Liste <E> in Kotlin unveränderlich. Dies würde jedoch funktionieren:
quelle
list2
es sich um eine veränderbare Liste handelt, siehe stackoverflow.com/questions/43114367/… .Beschränkung der Mutabilität auf Builder
Die Top-Antworten hier sprechen korrekt für den Unterschied in Kotlin zwischen schreibgeschützt
List
(HINWEIS: schreibgeschützt, nicht "unveränderlich" ) undMutableList
.Im Allgemeinen sollte man sich bemühen, schreibgeschützte Listen zu verwenden. Die Veränderbarkeit ist jedoch zur Konstruktionszeit häufig noch nützlich , insbesondere wenn es sich um Bibliotheken von Drittanbietern mit nicht funktionierenden Schnittstellen handelt. In Fällen, in denen alternative Konstruktionstechniken nicht verfügbar sind, z. B. die
listOf
direkte Verwendung oder Anwendung eines funktionalen Konstrukts wiefold
oderreduce
, erstellt ein einfaches Konstruktor mit "Builder-Funktion" wie das folgende eine schreibgeschützte Liste aus einer temporär veränderlichen:und dies kann gut in eine wiederverwendbare Inline-Dienstprogrammfunktion eingekapselt werden:
was so genannt werden kann:
Jetzt ist die gesamte Veränderlichkeit auf einen Blockbereich beschränkt, der für die Erstellung der schreibgeschützten Liste verwendet wird, und der Rest Ihres Codes verwendet die schreibgeschützte Liste, die vom Builder ausgegeben wird.
UPDATE : Ab Kotlin 1.3.70 ist die oben genannte genaue
buildList
Funktion in der Standardbibliothek als experimentelle Funktion zusammen mit ihren Analoga und verfügbar . Siehe https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/ .buildSet
buildMap
quelle
Im Konzept unveränderlicher Daten ist dies möglicherweise ein besserer Weg:
quelle
A
list
istimmutable
durchDefault
, können SieArrayList
stattdessen. so was :dann können Sie
add/delete
Artikel davon wie folgt:quelle