I have an interface
public interface FooBar<T> { }
I have a class that implements it
public class BarFoo implements FooBar<Person> { }
With reflection, I want to take an instance of BarFoo and get that the version of FooBar it implements is Person.
I use .getInterfaces
from BarFoo to get back to FooBar, but that doesn't help me find out what T is.
We can subtype a generic class or interface by extending or implementing it. The relationship between the type parameters of one class or interface and the type parameters of another are determined by the extends and implements clauses.
A generic interface is primarily a normal interface like any other. It can be used to declare a variable but assigned the appropriate class. It can be returned from a method. It can be passed as argument.
You cant create an instance of an Interface.
You can grab generic interfaces of a class by Class#getGenericInterfaces()
which you then in turn check if it's a ParameterizedType
and then grab the actual type arguments accordingly.
Type[] genericInterfaces = BarFoo.class.getGenericInterfaces(); for (Type genericInterface : genericInterfaces) { if (genericInterface instanceof ParameterizedType) { Type[] genericTypes = ((ParameterizedType) genericInterface).getActualTypeArguments(); for (Type genericType : genericTypes) { System.out.println("Generic type: " + genericType); } } }
Try something like the following:
Class<T> thisClass = null; Type type = getClass().getGenericSuperclass(); if (type instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) type; Type[] typeArguments = parameterizedType.getActualTypeArguments(); thisClass = (Class<T>) typeArguments[0]; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With