Como verificar a classe “instanceof” no kotlin?

103

Na classe Kotlin, tenho parâmetro do método como objeto (Veja doc Kotlin aqui ) para o tipo de classe T . Como objeto, estou passando diferentes classes quando estou chamando o método. Em Java, podemos comparar a classe usando o instanceofobjeto de qual classe ela é.

Então, eu quero verificar e comparar em tempo de execução qual classe é essa?

Como posso verificar as instanceofaulas no kotlin?

pRaNaY
fonte

Respostas:

229

Use is.

if (myInstance is String) { ... }

ou o reverso !is

if (myInstance !is String) { ... }
nhaarman
fonte
37

Combinando whene is:

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

copiado da documentação oficial

assinatura de método
fonte
1
Sim, esta é a forma idiomática.
StephenBoesch
15

Podemos verificar se um objeto está em conformidade com um determinado tipo em tempo de execução usando o isoperador ou sua forma negada !is.

Exemplo:

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

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

Outro exemplo no caso de objeto personalizado:

Deixe, eu tenho um 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
fonte
4
Observe outra coisa interessante aqui: dentro do bloco de if, objé automaticamente convertido para String. Portanto, você pode usar propriedades como lengthdiretamente, sem a necessidade de converter explicitamente objpara Stringdentro do bloco.
Jesper
7

Você pode usar 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
fonte
4

Tente usar uma palavra-chave chamada is Referência da página oficial

if (obj is String) {
    // obj is a String
}
if (obj !is String) {
    // // obj is not a String
}
Terril Thomas
fonte
É ótimo dar resposta com doc oficial. Mas é uma prática recomendada adicionar código de amostra na resposta, é útil se o link estiver inativo. Obrigado pela resposta.
pRaNaY
Respostas apenas vinculadas não são preferidas.
Jayson Minard
1

Você pode ler a documentação do Kotlin aqui https://kotlinlang.org/docs/reference/typecasts.html . Podemos verificar se um objeto está em conformidade com um determinado tipo em tempo de execução usando o isoperador ou sua forma negada !is, por exemplo, 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
}

então, na função principal, tento imprimir e mostrar no terminal:

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

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

Esta é a saída

6
500
Cevin Ways
fonte
0

Você pode verificar assim

 private var mActivity : Activity? = null

então

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

    if (context is MainActivity){
        mActivity = context
    }

}
The Bala
fonte
-2

Outra solução: KOTLIN

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

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