我们假设我有这些课程,
public class StringObjectKeyValueStore<V> extends AbstractObjectStore<V>
implements KeyValueStore<String, V> {
}
public abstract class AbstractObjectStore<V> {
private final Class<V> type;
public AbstractObjectStore() {
this.type = (Class<V>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
我这样使用它:
KeyValueStore<String,Friend> friendstore = new StringObjectKeyValueStore();
在AbstractObjectStore
中如何在不修改com.xzvf.models.Friend
构造函数并在其中传递AbstractObjectStore
的情况下获取Class<V> clazz
。
从我调试这部分
((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
只需返回name = {java.lang.String@1452} "V"
答案 0 :(得分:1)
你做不到。不可能。
首先,Class#getGenericSuperclass()
返回表示实体的直接超类的Type (类,接口,基本类型或void)由此类表示。
因此对于StringObjectKeyValueStore
,直接超类是AbstractObjectStore
,ParameterizedType
,因为它是使用类型变量进行参数化的。 ParamerizedType
有getActualTypeArguments
方法
返回一个Type对象数组,表示此类型的实际类型参数。
对于你的例子,即。 StringObjectKeyValueStore
,通用超类是AbstractObjectStore
,在StringObjectKeyValueStore
类声明中给出了单个类型参数,
public class StringObjectKeyValueStore<V> extends AbstractObjectStore<V>
即。类型变量V
。所以,对于
KeyValueStore<String,Friend> = new StringObjectKeyValueStore();
此代码
((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
将返回类型变量TypeVariableImpl
的{{1}}对象。
如果您的声明是
V
然后
public class StringObjectKeyValueStore<V> extends AbstractObjectStore<String>
// ^ see here
将返回((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
的{{1}}对象,因为Class
是您使用的实际类型参数。
答案 1 :(得分:1)
这是可行的唯一方法是,如果你继承StringObjectKeyValueStore
:
class FriendStore extends StringObjectKeyValueStore<Friend>{}
您可以使用TypeTools解析特定类型的V
,例如KeyValueStore
:
Class<?> v = TypeResolver.resolveRawArguments(KeyValueStore.class, FriendStore.class)[1];
assert v == Friend.class;