Was bedeutet “::” in Kotlin?

Lesezeit: 4 Minuten

Benutzer-Avatar
Gewinner1

Ich bin neu bei Kotlin
Ich habe diesen Code zum Öffnen einer anderen Aktivität verwendet:

startActivity(Intent(this,IntroAndLang::class.java))

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


Benutzer-Avatar
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.

    – AP

    14. Januar um 10:40 Uhr


Benutzer-Avatar
Raul Sharma

:: wird für Reflektion in Kotlin verwendet

  1. Klassenreferenz val myClass = MyClass::class
  2. Funktionsreferenz this::isEmpty
  3. Eigenschaftsreferenz ::someVal.isInitialized
  4. Konstruktorreferenz ::MyClass

Zum ausführlichen Nachlesen Offizielle Dokumentation

  • die mit Abstand beste Antwort

    – Mohsen

    17. September 2020 um 15:45 Uhr

  • @mohsen stimmte zu.

    – wosuc

    9. Dezember 2020 um 2:26 Uhr

  • 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


Benutzer-Avatar
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

Benutzer-Avatar
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).

Mehr Infos unter https://kotlinlang.org/docs/reference/reflection.html

1013990cookie-checkWas bedeutet “::” in Kotlin?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy