DEV Community

Rajesh Bhola
Rajesh Bhola

Posted on

`instanceof` Operator in Java — Part 2

In this part, we'll explore how instanceof helps prevent ClassCastException, compare it with Class.isInstance(), learn modern pattern matching, and cover common interview questions.


Preventing ClassCastException

One of the primary reasons for using instanceof is to safely cast objects.

Consider the following example.

Object developer = new String("Rajesh");

String name = (String) developer;

System.out.println(name);
Enter fullscreen mode Exit fullscreen mode

Output

Rajesh
Enter fullscreen mode Exit fullscreen mode

This works because the actual object is a String.


Now consider this example.

Object developer = new Object();

String name = (String) developer;
Enter fullscreen mode Exit fullscreen mode

Runtime Error

java.lang.ClassCastException
Enter fullscreen mode Exit fullscreen mode

Why?

The object is an Object, not a String.

Java cannot convert one unrelated object into another.


The Safe Approach

Instead of directly casting,

Object developer = getDeveloper();

if (developer instanceof String) {

    String name = (String) developer;

    System.out.println(name);

}
Enter fullscreen mode Exit fullscreen mode

The cast is performed only if the object is actually a String.

This prevents ClassCastException.


instanceof vs Class.isInstance()

Both can check an object's type, but they are used in different situations.

instanceof Class.isInstance()
Operator Method
Type known at compile time Type known at runtime
Faster and simpler Useful for reflection
Uses class/interface name directly Uses a Class object

Example: instanceof

String developer = "Rajesh";

System.out.println(developer instanceof Object);
Enter fullscreen mode Exit fullscreen mode

Output

true
Enter fullscreen mode Exit fullscreen mode

Example: Class.isInstance()

Object developer = "Rajesh";

Class<?> clazz = String.class;

System.out.println(clazz.isInstance(developer));
Enter fullscreen mode Exit fullscreen mode

Output

true
Enter fullscreen mode Exit fullscreen mode

Here, the type is supplied dynamically using a Class object.

This is useful when working with reflection, frameworks, or generic libraries.


Pattern Matching for instanceof (Java 16+)

Modern Java introduced Pattern Matching for instanceof, eliminating the need for an explicit cast.

Instead of writing

Object developer = "Rajesh";

if (developer instanceof String) {

    String name = (String) developer;

    System.out.println(name.toUpperCase());

}
Enter fullscreen mode Exit fullscreen mode

you can simply write

Object developer = "Rajesh";

if (developer instanceof String name) {

    System.out.println(name.toUpperCase());

}
Enter fullscreen mode Exit fullscreen mode

Output

RAJESH
Enter fullscreen mode Exit fullscreen mode

Notice that there is no explicit cast.

The variable name is automatically created with the correct type.

This feature makes the code shorter, cleaner, and less error-prone.

Available in Java 16 and later.


Interface Example

The instanceof operator also works with interfaces.

ArrayList<String> developers = new ArrayList<>();

System.out.println(developers instanceof ArrayList);

System.out.println(developers instanceof List);

System.out.println(developers instanceof Collection);

System.out.println(developers instanceof Iterable);

System.out.println(developers instanceof Object);
Enter fullscreen mode Exit fullscreen mode

Output

true
true
true
true
true
Enter fullscreen mode Exit fullscreen mode

Why?

ArrayList

  • extends AbstractList
  • implements List
  • List extends Collection
  • Collection extends Iterable

Every ArrayList object is also a

  • List
  • Collection
  • Iterable
  • Object

Visual Representation

          Object
             ▲
             │
        AbstractList
             ▲
             │
        ArrayList
             │
             ▼
            List
             ▼
        Collection
             ▼
          Iterable
Enter fullscreen mode Exit fullscreen mode

Runtime Type Matters

Consider this example.

Object developer = new String("Rajesh");

System.out.println(developer instanceof String);

System.out.println(developer instanceof Object);
Enter fullscreen mode Exit fullscreen mode

Output

true
true
Enter fullscreen mode Exit fullscreen mode

Now change the object.

Object developer = new Object();

System.out.println(developer instanceof String);
Enter fullscreen mode Exit fullscreen mode

Output

false
Enter fullscreen mode Exit fullscreen mode

The declared reference type remains Object.

Only the runtime object changes.

This demonstrates that instanceof always checks the actual object, not the reference type.


Common Interview Questions

Question 1

String developer = null;

System.out.println(developer instanceof String);
Enter fullscreen mode Exit fullscreen mode

Output

false
Enter fullscreen mode Exit fullscreen mode

Question 2

Object developer = "Rajesh";

System.out.println(developer instanceof Object);
Enter fullscreen mode Exit fullscreen mode

Output

true
Enter fullscreen mode Exit fullscreen mode

Question 3

Object developer = "Rajesh";

System.out.println(developer instanceof String);
Enter fullscreen mode Exit fullscreen mode

Output

true
Enter fullscreen mode Exit fullscreen mode

Question 4

Object developer = new Object();

System.out.println(developer instanceof String);
Enter fullscreen mode Exit fullscreen mode

Output

false
Enter fullscreen mode Exit fullscreen mode

Question 5

Thread thread = new Thread();

System.out.println(thread instanceof Runnable);
Enter fullscreen mode Exit fullscreen mode

Output

true
Enter fullscreen mode Exit fullscreen mode

Common Beginner Mistakes

Forgetting to Check Before Casting

Incorrect

Object employee = new Object();

String name = (String) employee;
Enter fullscreen mode Exit fullscreen mode

This throws

ClassCastException
Enter fullscreen mode Exit fullscreen mode

Always verify the type first.

if (employee instanceof String) {

    String name = (String) employee;

}
Enter fullscreen mode Exit fullscreen mode

Thinking instanceof Checks the Variable Type

Incorrect assumption

Object developer = new String("Rajesh");
Enter fullscreen mode Exit fullscreen mode

Some beginners expect

developer instanceof String
Enter fullscreen mode Exit fullscreen mode

to return false because the variable is declared as Object.

Actually, it returns

true
Enter fullscreen mode Exit fullscreen mode

because the runtime object is a String.


Forgetting That null Is Safe

Many beginners write

if (developer != null &&
    developer instanceof String)
Enter fullscreen mode Exit fullscreen mode

The null check is unnecessary because

developer instanceof String
Enter fullscreen mode Exit fullscreen mode

already returns false when developer is null.


Best Practices

  • Use instanceof before downcasting.
  • Prefer pattern matching (instanceof Type variable) in Java 16 and later.
  • Avoid unnecessary casts.
  • Use meaningful variable names instead of o, x, or a.
  • Do not use instanceof when polymorphism can solve the problem more elegantly.
  • Keep type-checking logic simple and readable.

Quick Memory Trick 🧠

Think of instanceof as asking a simple question:

"Is this object a member of this class (or one of its parent/interface types)?"

If the answer is yes, it returns

true
Enter fullscreen mode Exit fullscreen mode

Otherwise,

false
Enter fullscreen mode Exit fullscreen mode

If the types are unrelated,

the code doesn't even compile.


Summary Table

Scenario Result
Same class true
Parent class true
Implemented interface true
Child class (actual object matches) true
Runtime object doesn't match false
null instanceof X false
Unrelated types ❌ Compile-time error

Key Takeaways

  • instanceof checks an object's runtime type.
  • It always returns a boolean value.
  • It is commonly used before downcasting.
  • It returns true for the object's class, parent classes, and implemented interfaces.
  • null instanceof X always returns false.
  • Unrelated types produce a compile-time error.
  • Pattern matching (instanceof Type variable) simplifies casting in Java 16+.
  • Using instanceof correctly helps prevent ClassCastException.

Happy Coding!

Top comments (0)