我有以下类层次结构:
public abstract class Config<T> implements Proxy<T> {
public abstract T parse();
public T get() {....}
}
public class IntegerConfig<Integer> extends Config<Integer> {
public Integer parse() {...}
}
public class LongConfig<Long> extends Config<Long> {
public Long parse() {...}
}
public class IntegerListConfig<List<Integer>> extends Config<List<Integer>> {
public List<Integer> parse() {....}
}
等等......
我想介绍一个新课程:
public class ConfigMutation<T> implements Proxy<T> {
public ConfigMutation(....) {
//// create a concrete implementation of Config<T> according to actual parameterized type
}
}
本质上,我想避免重复Config的整个类层次结构,并在ConfigMutation中支持在Config类层次结构中具有参数化实现的所有类型。
无法找到办法。 (Class<T>)((ParameterizedType)getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0]
显然会返回T,而不是实际类型。
此外,一旦这个问题得到解决,如果有人可以使用泛型类型建议一些工厂模式,我会很高兴,所以当我在ConfigMutation中实例化一个Config派生类时,我不需要用巨大的if ... else阻止实际类型。
谢谢, 利奥尔
答案 0 :(得分:3)
将您的ConfigMutation
课程更改为:
public class ConfigMutation<U,T extends Config<U>> implements Proxy<U> {
public ConfigMutation() {
}
}
然后,您可以将ConfigMutation
用作:
ConfigMutation<Integer,IntegerConfig> mutation;
您无法按照以下方式执行以下操作:
ConfigMutation<String,IntegerConfig> mutation;
也就是说,您需要对具体的Config
实施者进行更改。例如,将IntegerConfig
更改为:
public class IntegerConfig extends Config<Integer> {
public Integer parse() {...}
}
Integer
中的IntegerConfig<Integer>
将被视为类型参数,而不是Integer
类,而不是您想要的类。 (IDE应该为此提供警告; 类型参数Integer隐藏类型Integer )