someguy
someguy

Reputation: 7334

Java: instanceof Generic

Isn't there any way to find the class-type of a generic?

if (T instanceof String) {
    // do something...
}

The above definitely does not compile.

Upvotes: 43

Views: 65496

Answers (4)

Adir Dayan
Adir Dayan

Reputation: 1617

If you have specific field you can just check it like below:

private <T> String someMethod(T genericElement)
{
    if (String.class.isInstance(genericElement))
    {
        return (String) genericElement;
    }
...

Upvotes: 2

Tomasz Krzyżak
Tomasz Krzyżak

Reputation: 1097

if you have subclass

public class SomeClass extends SomeSubclass<String>{}

and

public class SomeSubclass<T> {}

then there is a way to discover type of T by executing code

Type t = getClass().getGenericSuperclass()
if (t instanceof ParameterizedType) {
    Type[] actualTypeArguments = ((ParameterizedType)t).getActualTypeArguments()
    // in simple cases actualTypeArguments will contain Classes, since Class implements Type
}

if your case are a bit more complex (? extends String)` take a look at org.ormunit.entity.AEntityAccessor#extractClass

Upvotes: 3

drekka
drekka

Reputation: 21883

It won't compile because T is not a variable, but a place holder for a class that is defined at runtime. Here's a quick sample:

public class Test<T> {

public void something(T arg) {
    if (arg instanceof String) {
        System.out.println("Woot!");
    }
}

public static void main(String[] args) {
    Test<String> t = new Test<String>();
    t.something("Hello");
}

}

Upvotes: 5

Peter Lawrey
Peter Lawrey

Reputation: 533442

Generics are a compile time feature. Generics add checks at compile time which may not have any meaning at runtime. This is one example. You can only check the type of the object referenced which could be a super type in code. If you want to pass the type T you have do this explicitly.

void someMethod(Class<T> tClass) {
    if(String.class.isAssignableFrom(tClass)) 

or

void someMethod(Class<T> tClass, T tArg) {

Note: the type might not be the same,

someMethod(Number.class, 1);

Upvotes: 58

Related Questions