我想要一个泛型方法,它使用从类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)
答案 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(...)
。