Die Instanz eines Objekts in Kotlin ermitteln
-
Verwenden Sie
is
mit Generics, um die Instanz eines Objekts in Kotlin abzurufen -
Verwenden Sie
is
mit dem Schlüsselwortwhen
, um die Instanz eines Objekts in Kotlin zu erhalten - Fazit
Das Abrufen der Instanz eines Objekts ist eine gängige Entwicklungspraxis, der wir in den meisten Programmiersprachen wie Kotlin, Java, TypeScript, JavaSript und anderen begegnen werden. Ein Beispiel für eine Situation, in der Sie möglicherweise die Instanz eines Elements finden möchten, ist, wenn Sie Elemente basierend auf ihrem Typ sortieren möchten.
Wenn die Instanz eines Elements gefunden wird, ist das Ergebnis wahr, wenn das Element den gleichen Typ hat wie das Element, mit dem abgeglichen wird; andernfalls wird false zurückgegeben.
In diesem Tutorial erfahren Sie, wie Sie mit Kotlin die Instanz eines Objekts zur Laufzeit abrufen.
Verwenden Sie is
mit Generics, um die Instanz eines Objekts in Kotlin abzurufen
Generic ist ein Entwicklungsansatz, der verwendet wird, um unseren Code so zu entwerfen, dass er mit jedem Typ wiederverwendet werden kann.
Gehen Sie zu IntelliJ und wählen Sie Datei > Neues Projekt
, um ein neues Kotlin-Projekt zu erstellen. Geben Sie den Projektnamen als kotlinInstancOf
oder einen beliebigen Namen ein.
Wählen Sie Kotlin im Abschnitt Sprache und Intellij im Abschnitt Build-System aus. Klicken Sie auf die Schaltfläche Erstellen, um das Projekt zu erstellen.
Sobald das Projekt erstellt ist, erstellen Sie die Ordnerstruktur com/instanceOf
unter dem Ordner kotlin. Erstellen Sie eine Datei mit dem Namen Main.kt
im Ordner instanceOf
und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein:
package com.instanceOf
interface Employee{
fun work(): String;
}
class Manager(private val name: String): Employee{
override fun work(): String {
return "$name is preparing the project schedule";
}
}
class Janitor(private val name: String): Employee{
override fun work(): String {
return "$name is cleaning the office";
}
}
fun <T> doWork(Object: T): String {
if (Object is Employee){
return Object.work();
}else{
throw RuntimeException("$Object is not of type Employee")
}
}
fun main() {
println(doWork(Manager("John")));
println(doWork(Janitor("Peter")));
println(doWork("mary"));
}
In diesem Beispiel haben wir eine Schnittstelle namens Employee
und zwei konkrete Implementierungen namens Manager
und Hausmeister
erstellt.
doWork()
ist eine oben definierte generische Methode, die das Schlüsselwort is
verwendet, um herauszufinden, ob das als Argument übergebene Objekt vom gleichen Typ wie Employee
ist. Wenn die Bedingung wahr zurückgibt, rufen wir die work()
-Methode des Objekts auf; andernfalls werfen wir eine RuntimeException()
.
In der Hauptmethode rufen wir die Methode doWork()
dreimal auf und übergeben jeweils den Manager
, den Hausmeister
und einen String als Argumente.
Die ersten beiden Aufrufe der Methode werden als wahr gewertet, da sie eine Beziehung zum Employee
haben. Der letzte Aufruf wird aber als falsch ausgewertet, da das String-Argument keine Beziehung zum Employee
hat.
Führen Sie den Code aus, um zu überprüfen, ob die Ausgabe wie unten gezeigt ist.
Exception in thread "main" java.lang.RuntimeException: mary is not of type Employee
John is preparing the project schedule
Peter is cleaning the office
Da das Schlüsselwort is
einen booleschen Wert zurückgibt, können wir die Umkehrung des Schlüsselworts is
zurückgeben, indem wir das Zeichen !
hinzufügen. vor dem Schlüsselwort. Der Charakter !
wird normalerweise als nicht
ausgesprochen, was bei der Arbeit mit Logikgattern üblich ist.
Kommentieren Sie die Methode doWork()
und ersetzen Sie sie durch den folgenden Code:
fun <T> doWork(Object: T): String{
if (Object !is Employee){
throw RuntimeException("$Object is not of type employee");
}
return Object.work();
}
Führen Sie den Code erneut aus und beachten Sie, dass das Ergebnis mit der Ausgabe im vorherigen Beispiel identisch ist:
John is preparing the project schedule
Peter is cleaning the office
Exception in thread "main" java.lang.RuntimeException: mary is not of type employee
Verwenden Sie is
mit dem Schlüsselwort when
, um die Instanz eines Objekts in Kotlin zu erhalten
Das Schlüsselwort when
funktioniert genauso wie das Schlüsselwort switch
mit Java. Der einzige Unterschied ist die Syntax.
Kommentieren Sie das vorherige Beispiel und kopieren Sie den folgenden Code und fügen Sie ihn nach dem Kommentar in die Datei Main.kt
ein.
fun fetchData() = listOf<Any>("book",3,true,"computer");
fun main() {
for (data in fetchData()) {
when(data){
is String -> println(data)
is Int -> println(data)
is Boolean -> println(data)
}
}
}
Im obigen Beispiel haben wir eine Methode fetchData()
erstellt, die eine Liste vom Typ Any
zurückgibt, indem wir sie der Hilfsmethode listOf()
zuweisen. Die Methode listOf()
gibt eine Liste mit den Typen String, Int und Boolean zurück.
In der Methode main
haben wir den Elementtyp zur Laufzeit ermittelt, indem wir die Liste mit einer Schleife durchlaufen und jeden Wert an die Methode when()
delegiert haben. Innerhalb des when()
-Blocks wird der Typ des übergebenen Werts mit is
bestimmt, und wenn die Bedingung als wahr ausgewertet wird, wird der Wert in der Konsole protokolliert.
Beachten Sie, dass der Wert nicht in der Konsole protokolliert wird, wenn Sie der Liste einen anderen Typ hinzufügen, ohne dessen Typ im when()
-Block zu finden.
Führen Sie den Code aus und vergewissern Sie sich, dass die Ausgabe wie unten gezeigt aussieht:
book
3
true
computer
Fazit
In diesem Tutorial haben wir gelernt, wie man die Instanz eines Elements zur Laufzeit erhält, indem man die Programmiersprache Kotlin nutzt. Zu den behandelten Ansätzen gehören: Verwenden des Schlüsselworts is
mit Generika und des Schlüsselworts is
mit dem Schlüsselwort when
.
Beachten Sie, dass wir bei der Verwendung von Generika sicherstellen müssen, dass wir reifizierte
Typen verwenden, was bedeutet, dass die Typinformationen zur Laufzeit verfügbar sind; Andernfalls funktioniert die Typprüfung nicht.
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub