Java generic:将类限制为特定的实现。

时间:2015-07-19 07:45:17

标签: java generics

我有以下类层次结构:

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阻止实际类型。

谢谢, 利奥尔

1 个答案:

答案 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