12
interface Foo<T> { ... }
class Bar implements Foo<Baz> { ... }

I've got a Bar object. How to get the value of T for it (Baz)?

So far, I only managed to get the interface and T, but I can't see a way to get its value.

Thanks in advance.

2 Answers 2

20
Type type = bar.getClass().getGenericInterfaces()[0];

if (type instanceof ParameterizedType) {
    Type actualType = ((ParameterizedType) type).getActualTypeArguments()[0];
    System.out.println(actualType);
}

Of course, in the general case, you should iterate over the array, rather than assuming it has excatly one element ([0]). With the above example, you can cast actualType to java.lang.Class. In other cases it may be different (see comment by meriton)

Sign up to request clarification or add additional context in comments.

2 Comments

Note that in general, actualType is not necessarily a plain java.lang.Class - it could also be a GenericArrayType, a ParametrizedType, or a TypeVariable.
True. I meant that in his case it's Class.
0

If you already have Guava on the classpath, this is a bit more robust as you specify the interface/superclass by type rather than index.

TypeToken<?> baz = TypeToken.of(Bar.class).resolveType(Foo.class.getTypeParameters()[0]);
System.out.println(baz.getRawType()); // class Baz

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.