Как проверить класс instanceof в котлине?

95

В Kotlin класса, у меня есть параметр метода в качестве объекта (см Kotlin документа здесь ) для типа класса T . В качестве объекта я передаю разные классы, когда вызываю метод. В Java мы можем сравнивать класс с использованием instanceofобъекта, к какому классу он относится.

Итак, я хочу проверить и сравнить во время выполнения, какой это класс?

Как я могу проверить instanceofкласс в котлине?

ПРАЙН
источник

Ответы:

213

Используйте is.

if (myInstance is String) { ... }

или наоборот !is

if (myInstance !is String) { ... }
Nhaarman
источник
33

Комбинирование whenи is:

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

скопировано из официальной документации

метод подпись
источник
1
Да, это идиоматический способ.
Стивен Бош,
15

Мы можем проверить, соответствует ли объект заданному типу во время выполнения, используя isоператор или его отрицательную форму !is.

Пример:

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

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

Другой пример в случае пользовательского объекта:

Давай, у меня objтипаж CustomObject.

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

if (obj !is CustomObject) {
    print("obj is not of type CustomObject")
}
Авиджит Кармакар
источник
4
Обратите внимание еще одну приятную вещь здесь: внутри блока if, objавтоматически приводится кString . Таким образом, вы можете использовать такие свойства, как lengthнапрямую, без необходимости явно приводить objих Stringвнутрь блока.
Джеспер
7

Вы можете использовать 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 */ }
}
лед1000
источник
3

Попробуйте использовать ключевое слово под названием is Официальная ссылка на страницу

if (obj is String) {
    // obj is a String
}
if (obj !is String) {
    // // obj is not a String
}
Террил Томас
источник
Замечательно дать ответ в официальном документе. Но лучше добавить в ответ образец кода, это полезно, если ссылка не работает. Спасибо за ответ.
pRaNaY
Ответы только по ссылкам не являются предпочтительными.
Джейсон Минард
0

Вы можете проверить вот так

 private var mActivity : Activity? = null

тогда

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

    if (context is MainActivity){
        mActivity = context
    }

}
Бала
источник
0

Вы можете прочитать документацию Kotlin здесь https://kotlinlang.org/docs/reference/typecasts.html . Мы можем проверить, соответствует ли объект заданному типу во время выполнения, используя isоператор или его отрицательную форму !is, например, используя 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
}

затем в основной функции я пытаюсь распечатать и показать его на терминале:

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

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

Это результат

6
500
Cevin Ways
источник
-1

Другое решение: КОТЛИН

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

if (fragment?.tag == "MyFragment")
{}
Альваро Агуэро
источник