276

In Kotlin class, I have method parameter as object (See Kotlin doc here ) for class type T. As object I am passing different classes when I am calling method. In Java we can able to compare class using instanceof of object which class it is.

So I want to check and compare at runtime which Class it is?

How can I check instanceof class in Kotlin?

9 Answers 9

495

Use is.

if (myInstance is String) { ... }

or the reverse !is

if (myInstance !is String) { ... }
Sign up to request clarification or add additional context in comments.

3 Comments

This only works when the instance object is created from a Kotlin class. This will not work if the instance was created using newInstance() from something like SomeClass::class.java
@androiddev why is that?
No idea. I tried it but it doesn't work. Some quirk with the way Kotlin interacts with Java. However, you can use SomeClass.isInstance(someObject), which does work.
79

Combining when and is:

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

copied from official documentation

1 Comment

Yes this is the idiomatic way.
37

We can check whether an object conforms to a given type at runtime by using the is operator or its negated form !is.

Example:

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

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

Another Example in case of Custom Object:

Let, I have an obj of type CustomObject.

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

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

3 Comments

Note one other nice thing here: inside the block of the if, obj is automatically cast to String. So you can use properties such as length directly, without the need to explicitly cast obj to String inside the block.
Also, nice opportunity to use an else statement ;)
What if i want to differentiate two classes where one extends the other e.g LinearLayoutManager & GridLayoutManager
10

You can use 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 */ }
}

Comments

10

Try using keyword called is Official page reference

if (obj is String) {
    // obj is a String
}
if (obj !is String) {
    // // obj is not a String
}

1 Comment

It is great thing to give answer with official doc. But it is better practices to add sample code in answer, it is helpful if link was dead. Thanks for the answer.
5

You can check like this

 private var mActivity : Activity? = null

then

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

    if (context is MainActivity){
        mActivity = context
    }

}

Comments

3

You can read Kotlin Documentation here https://kotlinlang.org/docs/reference/typecasts.html . We can check whether an object conforms to a given type at runtime by using the is operator or its negated form !is, for the example using 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
}

then in main function i try to print and show it on terminal :

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

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

This is the output

6
500

Comments

0

If you have a collection of objects, you can also keep those that are specific instance:

interface Fruit
class Peach: Fruit
class Watermelon: Fruit

val fruits = listOf(
    Peach(),
    Peach(),
    Watermelon(),
    Peach(),
    Watermelon()
)

val peaches = fruits.filterIsInstance(Peach::class.java)

Comments

-8

Other solution : KOTLIN

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

if (fragment?.tag == "MyFragment")
{}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.