Java中的通用静态方法

时间:2014-05-15 08:15:20

标签: java generics methods

我想要一个泛型方法,它使用从类Element继承的对象填充List 我的代码看起来像这样:

public static <T extends Element> List<T> getElement(ElementType type){
   List<T> elements = new ArrayList<>();
   switch(type){
        case LIGHT:
            elements.add(new Light(id,bezeichnung,beckhoffVars, false));
            break;
        case LIGHTDIM:
            elements.add(new LightDim(id,bezeichnung,beckhoffVars, false, 0));
            break;
   return elements;
}

但是编译器说:     类型List中的方法add(T)不适用于参数(Light)
    类型List中的方法add(T)不适用于参数(LightDim)

4 个答案:

答案 0 :(得分:1)

如果你真的想创建任何需要的类的列表,试试这个

public static <T> List<T> getElement(Class<T> t) {
    List<T> elements = new ArrayList<>();
    return elements;
}

您通过执行

来调用此方法

List<String> list = getElement(Light.class);

你可以切换clas的名字(如果我记得java 7中的字符串开关是允许的话),如果我错了你可以将classname翻译成enum。

如果你想为你的数组创建单个元素,那么不需要switch语句,你可以通过反射来做到这一点。

但这不是正确的方法,正确的方法是创建一个类型列表,在您的案例Element

答案 1 :(得分:0)

根据建议使用

,您已经知道会得到什么类型
public static List<Element> getElement(ElementType type) {
    List<Element> elements = new ArrayList<>();
    switch (type) {
        case LIGHT:
            elements.add(new Light());
            break;
        case LIGHTDIM:
            elements.add(new LightDim());
            break;
    }
    return elements;
}  

使用通用List<>提供您想要的元素类型Element,但不允许其他人以通用方式使用您的方法。

这就是为什么不应该是通用的。

答案 2 :(得分:0)

那个明显的Light或LightDim类扩展了Element。但元素是<T>的列表。所以,您可以输入类似: -

case LIGHT:
    elements.add((T) new Light());
    break;
case LIGHTDIM:
    elements.add((T) new LightDim());
    break;

或者您可以使用

List <? super Element>

或者如果您知道要添加的对象是Element。可以具体如

List<Element>

答案 3 :(得分:0)

T的类型在编译时被绑定;因此,您无法根据运行时属性使其不同。要做到这一点,你必须通过某种工厂。

为什么不将它设计为类型中的方法呢?像type.wrapInList()一样?或至少type.createInstance(...)