Jak sprawdzić klasę „instanceof” w kotlinie?

103

Kotlin w klasie, mam parametr metody jako obiektu (patrz Kotlin doc tutaj ) dla typu klasy T . Jako obiekt przekazuję różne klasy, kiedy wywołuję metodę. W Javie możemy porównać klasę za pomocą instanceofobiektu, która to klasa.

Więc chcę sprawdzić i porównać w czasie wykonywania, która to klasa?

Jak mogę sprawdzić instanceofzajęcia w Kotlinie?

pRaNaY
źródło

Odpowiedzi:

230

Użyj is.

if (myInstance is String) { ... }

lub odwrotnie !is

if (myInstance !is String) { ... }
nhaarman
źródło
37

Łączenie wheni is:

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

skopiowane z oficjalnej dokumentacji

metody podpisu
źródło
1
Tak, to jest idiomatyczny sposób.
StephenBoesch
15

Możemy sprawdzić, czy obiekt jest zgodny z danym typem w czasie wykonywania, używając isoperatora lub jego zanegowanej formy !is.

Przykład:

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

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

Inny przykład w przypadku obiektu niestandardowego:

Niech mam objtyp CustomObject.

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

if (obj !is CustomObject) {
    print("obj is not of type CustomObject")
}
Avijit Karmakar
źródło
4
Uwaga jedną inną miłą rzeczą tutaj: wewnątrz bloku z if, objjest automatycznie przesyłać String. Możesz więc używać właściwości, takich jak lengthbezpośrednio, bez konieczności jawnego rzutowania objdo Stringwnętrza bloku.
Jesper
7

Możesz użyć 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
źródło
4

Spróbuj użyć słowa kluczowego o nazwie is Oficjalne odniesienie do strony

if (obj is String) {
    // obj is a String
}
if (obj !is String) {
    // // obj is not a String
}
Terril Thomas
źródło
Wspaniale jest udzielić odpowiedzi wraz z oficjalnym dokumentem. Ale lepszym rozwiązaniem jest dodanie przykładowego kodu w odpowiedzi, pomocne jest, jeśli link był martwy. Dziękuję za odpowiedź.
pRaNaY
Odpowiedzi tylko z linkami nie są preferowane.
Jayson Minard
1

Możesz przeczytać dokumentację Kotlin tutaj https://kotlinlang.org/docs/reference/typecasts.html . Możemy sprawdzić, czy obiekt jest zgodny z danym typem w czasie wykonywania za pomocą isoperatora lub jego zanegowanej formy !is, na przykład za pomocą 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
}

następnie w głównej funkcji próbuję wydrukować i pokazać to na terminalu:

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

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

To jest wynik

6
500
Cevin Ways
źródło
0

Możesz to sprawdzić

 private var mActivity : Activity? = null

następnie

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

    if (context is MainActivity){
        mActivity = context
    }

}
Bala
źródło
-2

Inne rozwiązanie: KOTLIN

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

if (fragment?.tag == "MyFragment")
{}
Álvaro Agüero
źródło