lkm
lkm

Reputation: 93

Java - how to tell class of an object?

Given a method that accepts as a parameter a certain supertype. Is there any way, within that method, to determine the actual class of the object that was passed to it? I.e. if a subtype of the allowable parameter was actually passed, is there a way to find out which type it is? If this isn't possible can someone explain why not (from a language design perspective)? Thanks

Update: just to make sure I was clear

Context: MySubType extends MyType

void doSomething(MyType myType) {
  //determine if myType is MyType OR one of its subclasses
  //i.e. if MySubType is passed as a parameter, I know that it can be explicitly
  //cast to a MySubType, but how can I ascertain that its this type
  //considering that there could be many subclasses of MyType
}

Since the method signature specifies the parameter as being MyType, then how can one tell if the object is actually a subtype of MyType (and which one).

Upvotes: 2

Views: 350

Answers (3)

vodkhang
vodkhang

Reputation: 18741

I assume that MyType is the superclass type, right?

1/ If you just want to know that it does not belong to your super class type: you can check

if (m.getClass() != MyType.getClass())

2/ If you want to check if m belongs to a certain subclass, I don't think there is a way, you have to hard code it like

if (m.getClass() == MySubType) {
}

or you can use:

if (!(m instanceof MySubType)) {
}

Upvotes: 1

bmargulies
bmargulies

Reputation: 100196

If you look at the javadoc for the Object class, you will find that every object supports getClass(). That's the Class of the object, and you can go from there.

If the object is MyType then getClass() == MyType.class'. If the object is a superclass, thengetClass() != MyType.class`.

There are only these possibilities. If the type of the param is MyType, and MyType is a class and not an interface, then either the object is MyClass or it's a subtype. If it's a subtype, then getClass() is returning the Class for the subtype. You can use the API of Class to explore it.

You can, of course, use reflection to explore the type hierarchy. You can ask MyType.class for a list of its direct subclasses, and recurse from there, and have a fine old time. But you don't need to.

Upvotes: 5

Haldean Brown
Haldean Brown

Reputation: 12721

Yes there is -- there's a built in reflection API called Trail that allows you to examine the types of any instance of a class. The method getClass() that is inherited from the Object class will give you a Class object that you can examine. A good starting point is the Trail tutorial from Sun.

Upvotes: 1

Related Questions