¿Cómo comprobar la clase "instancia de" en kotlin?

95

En la clase Kotlin, tengo parámetro de método como objeto (véase el documento Kotlin aquí ) para el tipo de clase T . Como objeto, paso diferentes clases cuando llamo al método. En Java podemos comparar la clase usando el instanceofobjeto de qué clase es.

Entonces, quiero verificar y comparar en tiempo de ejecución qué clase es.

¿Cómo puedo consultar la instanceofclase en kotlin?

pRaNaY
fuente

Respuestas:

213

Utilice is.

if (myInstance is String) { ... }

o al revés !is

if (myInstance !is String) { ... }
nhaarman
fuente
33

Combinando wheny is:

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

copiado de documentación oficial

método firma
fuente
1
Sí, esta es la forma idiomática.
StephenBoesch
15

Podemos verificar si un objeto se ajusta a un tipo dado en tiempo de ejecución usando el isoperador o su forma negada!is .

Ejemplo:

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

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

Otro ejemplo en el caso de un objeto personalizado:

Vamos, tengo un objtipo CustomObject.

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

if (obj !is CustomObject) {
    print("obj is not of type CustomObject")
}
Avijit Karmakar
fuente
4
Tenga en cuenta otra cosa interesante aquí: dentro del bloque de if, objse lanza automáticamente a String. Así que usted puede utilizar las propiedades tales como lengthdirectamente, sin la necesidad de convertir explícitamente objal Stringinterior del bloque.
Jesper
7

Puede utilizar 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 */ }
}
hielo1000
fuente
3

Intente usar la palabra clave llamada is Referencia de página oficial

if (obj is String) {
    // obj is a String
}
if (obj !is String) {
    // // obj is not a String
}
Terril Thomas
fuente
Es genial dar una respuesta con un documento oficial. Pero es una mejor práctica agregar un código de muestra en la respuesta, es útil si el enlace está muerto. Gracias por la respuesta.
pRaNaY
No se prefieren las respuestas solo vinculadas.
Jayson Minard
0

Puedes comprobar así

 private var mActivity : Activity? = null

entonces

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

    if (context is MainActivity){
        mActivity = context
    }

}
El Bala
fuente
0

Puede leer la documentación de Kotlin aquí https://kotlinlang.org/docs/reference/typecasts.html . Podemos verificar si un objeto se ajusta a un tipo dado en tiempo de ejecución usando el isoperador o su forma negada !is, por ejemplo usando 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
}

luego, en la función principal, trato de imprimir y mostrarlo en la terminal:

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

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

Esta es la salida

6
500
Cevin Ways
fuente
-1

Otra solución: KOTLIN

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

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