aktuelle Aktivität und Zielaktivität werden in Kotlin geschrieben
Ich kann nicht verstehen, warum es keinen Single gibt : anstatt :: beim IntroAndLang::class.java
: steht für Deklaration, :: ist ein Operator. Sehen hier.
– m0skit0
20. November 2017 um 21:02 Uhr
@ m0skit0 danke, warum ist es class.java, wenn ich eine Kotlin-Klasse verwende?
– Gewinner1
20. November 2017 um 21:03 Uhr
Die Android-API akzeptiert nur Java-Klassen, deshalb müssen Sie eine Java-Klasse übergeben. IntroAndLang::class gibt a zurück KClass (eine Kotlin-Klasse), dann .java gibt die Java-Klasse zurück. Beachten Sie, dass alle Kotlin-Klassen zu Java-Klassen kompiliert werden (.class Binärdateien) am Ende.
– m0skit0
20. November 2017 um 21:04 Uhr
j2emanue
:: konvertiert eine Kotlin-Funktion in ein Lambda.
Angenommen, Sie haben eine Funktion, die so aussieht:
fun printSquare(a: Int) = println(a * 2)
Und Sie haben eine Klasse, die ein Lambda als zweites Argument verwendet:
class MyClass(var someOtherVar: Any, var printSquare: (Int) -> Unit) {
fun doTheSquare(i: Int) {
printSquare(i)
}
}
Wie überstehst du die printSquare Funktion hinein MyClass? Wenn Sie Folgendes versuchen, funktioniert es nicht:
MyClass("someObject", printSquare) //printSquare is not a LAMBDA, it's a function so it gives compile error of wrong argument
Wie KONVERTIEREN wir also printSquare in ein Lambda, damit wir es weitergeben können? Verwenden Sie die :: Notation.
MyClass("someObject",::printSquare) //now compiler does not complain since it's expecting a lambda and we have indeed converted the `printSquare` FUNCTION into a LAMBDA.
Beachten Sie das bitte auch this ist impliziert … Bedeutung this::printSquare ist das gleiche wie ::printSquare. Also wenn die printSquare Funktion in einer anderen Klasse war, wie ein Presenter, dann könnten Sie sie wie folgt in Lambda konvertieren:
Presenter::printSquare
AKTUALISIEREN:
Auch das funktioniert mit Konstruktoren. Wenn Sie den Konstruktor einer Klasse erstellen und ihn dann in ein Lambda konvertieren möchten, geht das so:
(x, y) -> MyClass::new
das bedeutet übersetzt MyClass(x, y) in Kotlin.
bist du sicher MyObject::new funktioniert noch? Ich erhalte eine Fehlermeldung, wenn ich es als Ausdruck in den Quellcode einschließe.
– Benutzer2297550
3. November 2021 um 19:49 Uhr
Ich stimme dem Wortlaut dieser Antwort nicht ganz zu, da sich im Zusammenhang mit Programmiersprachen (normalerweise) auf “Lambda” bezieht anonym Funktion. Andererseits ist die :: Operator (in diesem Zusammenhang) erstellt a aufrufbare Referenz zu einer Funktion, dh einem Namen, der verwendet werden kann, um diese Funktion später im Code aufzurufen.
Ich habe mich gefragt warum isInitialized funktioniert nur mit :: Betreiber, aber danach fand ich diese Antwort und jetzt weiß ich warum. :: Operator erhält einen Verweis auf die Eigenschaft. Danke @Rahul Sharma
– MrVasilev
9. März um 20:40 Uhr
s1m0nw1
Wie in der angegeben Dokumente das ist ein Klasse Bezug:
Klassenreferenzen: Die grundlegendste Reflexionsfunktion ist das Abrufen der Laufzeitreferenz zu einer Kotlin-Klasse. Um den Verweis auf eine statisch bekannte Kotlin-Klasse zu erhalten, können Sie die Klassenliteral-Syntax verwenden:
val c = MyClass::class
//The reference is a value of type KClass.
Beachten Sie, dass eine Kotlin-Klassenreferenz nicht mit einer Java-Klassenreferenz identisch ist. Um eine Java-Klassenreferenz zu erhalten, verwenden Sie die Eigenschaft .java in einer KClass-Instanz.
Es ist zudem die Syntax für Methodenreferenzen wie in diesem einfachen Beispiel:
list.forEach(::println)
Es bezieht sich auf println in der Kotlin-Standardbibliothek definiert.
::println und IntroAndLang::class sind unabhängig, obwohl beide verwendet werden ::. Die Methodenreferenz konnte nicht zu a ausgewertet werden KClasses ist kein SAM-Typ!
– Alexej Romanow
21. November 2017 um 6:36 Uhr
Sie haben Recht, das war nicht die sauberste Antwort, ich habe sie geändert
– s1m0nw1
21. November 2017 um 6:42 Uhr
:: ist nur eine Möglichkeit, einen Lambda-Ausdruck zu schreiben. Grundsätzlich können wir damit auf eine Methode verweisen, dh beispielsweise eine Member-Funktion oder Eigenschaft class Person (val name: String, val age: Int) Jetzt können wir dies schreiben, um auf die Person zuzugreifen, die das maximale Alter hat. people.maxBy{it.age} wir können das obige ändern people.maxBy(Person::age)
– pcsaunak
6. Oktober 2020 um 10:32 Uhr
Oluwasegun Wahaab
Seit Kotlin 1.1 kann zusätzlich zu Klassen-, Funktions-, Eigenschafts- und Konstruktorreferenzen, wie oben angegeben, „::“ auch verwendet werden, um die gebundenen Referenzen auf alle oben genannten zu erhalten.
Zum Beispiel könnte die Verwendung von ‘::class’ verwendet werden, um die genaue Klasse eines bestimmten Objekts trotz des Typs des Empfängers wie unten zu erhalten …
val widget: Widget = ...
assert(widget is GoodWidget) { "Bad widget: ${widget::class.qualifiedName}" }
widget::class gibt die genaue Klasse des Objekts ‘widget’ als entweder ‘GoodWidget’ oder ‘BadWidget’ zurück, ungeachtet des Typs des Empfängerausdrucks (dh ‘Widget’ wie ursprünglich deklariert).
: steht für Deklaration, :: ist ein Operator. Sehen hier.
– m0skit0
20. November 2017 um 21:02 Uhr
@ m0skit0 danke, warum ist es class.java, wenn ich eine Kotlin-Klasse verwende?
– Gewinner1
20. November 2017 um 21:03 Uhr
Die Android-API akzeptiert nur Java-Klassen, deshalb müssen Sie eine Java-Klasse übergeben.
IntroAndLang::class
gibt a zurückKClass
(eine Kotlin-Klasse), dann.java
gibt die Java-Klasse zurück. Beachten Sie, dass alle Kotlin-Klassen zu Java-Klassen kompiliert werden (.class
Binärdateien) am Ende.– m0skit0
20. November 2017 um 21:04 Uhr