Wie überprüfe ich die Instanz der Klasse in Kotlin?

98

In Kotlin Klasse habe ich Methodenparameter als Objekt (siehe Kotlin doc hier ) für die Klasse Typ T . Als Objekt übergebe ich verschiedene Klassen, wenn ich method aufrufe. In Java können wir die Klasse anhand instanceofdes Objekts vergleichen, um welche Klasse es sich handelt.

Ich möchte also zur Laufzeit überprüfen und vergleichen, um welche Klasse es sich handelt.

Wie kann ich den instanceofUnterricht in Kotlin überprüfen ?

pRaNaY
quelle

Antworten:

219

Verwenden Sie is.

if (myInstance is String) { ... }

oder umgekehrt !is

if (myInstance !is String) { ... }
Nhaarman
quelle
35

Kombinieren whenund is:

when (x) {
    is Int -> print(x + 1)
    is String -> print(x.length + 1)
    is IntArray -> print(x.sum())
}

aus der offiziellen Dokumentation kopiert

Methodensignatur
quelle
1
Ja, das ist der idiomatische Weg.
StephenBoesch
15

Mit dem isOperator oder seiner negierten Form können wir überprüfen, ob ein Objekt zur Laufzeit einem bestimmten Typ entspricht !is.

Beispiel:

if (obj is String) {
    print(obj.length)
}

if (obj !is String) {
    print("Not a String")
}

Ein weiteres Beispiel für ein benutzerdefiniertes Objekt:

Lassen Sie mich einen objTyp haben CustomObject.

if (obj is CustomObject) {
    print("obj is of type CustomObject")
}

if (obj !is CustomObject) {
    print("obj is not of type CustomObject")
}
Avijit Karmakar
quelle
4
Beachten Sie eine andere nette Sache hier: im Inneren des Blocks von der if, objwird automatisch gegossen String. Sie können also Eigenschaften wie lengthdirekt verwenden, ohne explizit objin Stringden Block umwandeln zu müssen.
Jesper
7

Sie können verwenden is:

class B
val a: A = A()
if (a is A) { /* do something */ }
when (a) {
  someValue -> { /* do something */ }
  is B -> { /* do something */ }
  else -> { /* do something */ }
}
ice1000
quelle
4

Versuchen Sie es mit einem Schlüsselwort namens is Offizielle Seitenreferenz

if (obj is String) {
    // obj is a String
}
if (obj !is String) {
    // // obj is not a String
}
Terril Thomas
quelle
Es ist großartig, eine Antwort mit dem offiziellen Dokument zu geben. Es ist jedoch besser, als Antwort Beispielcode hinzuzufügen. Es ist hilfreich, wenn der Link tot war. Danke für die Antwort.
pRaNaY
Nur verknüpfte Antworten werden nicht bevorzugt.
Jayson Minard
1

Sie können die Kotlin-Dokumentation hier lesen: https://kotlinlang.org/docs/reference/typecasts.html . Mit dem isOperator oder seiner negierten Form können wir überprüfen, ob ein Objekt zur Laufzeit einem bestimmten Typ entspricht. !isBeispiel is:

fun <T> getResult(args: T): Int {
    if (args is String){ //check if argumen is String
        return args.toString().length
    }else if (args is Int){ //check if argumen is int
        return args.hashCode().times(5)
    }
    return 0
}

dann versuche ich in der Hauptfunktion, es zu drucken und auf dem Terminal anzuzeigen:

fun main() {
    val stringResult = getResult("Kotlin")
    val intResult = getResult(100)

    // TODO 2
    println(stringResult)
    println(intResult)
}

Dies ist die Ausgabe

6
500
Cevin Ways
quelle
0

Sie können dies überprüfen

 private var mActivity : Activity? = null

dann

 override fun onAttach(context: Context?) {
    super.onAttach(context)

    if (context is MainActivity){
        mActivity = context
    }

}
Der Bala
quelle
-1

Andere Lösung: KOTLIN

val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container)

if (fragment?.tag == "MyFragment")
{}
Álvaro Agüero
quelle