【发布时间】:2018-09-17 03:52:03
【问题描述】:
由于 java 泛型“扩展”关键字,我遇到了一个奇怪的问题。我已经开发了一种通用方法来从一个尽可能通用的方法中获取元素。
当我使用<? extends X> 时,我无法向其中添加任何元素。
在我的例子中,我使用通用模板来限制用户提供的参数并提供返回类型 ac。
class Root{
}
class Sub_1 extends Root{
}
class Sub_2 extends Root{
}
public static <T extends Root> List<T> getSubElements(Class<T> targetClass){
List<T> ls=new ArrayList<>();
if(targetClass.getSimpleName().equals("Sub_1")){
Sub_1 sub_1 = new Sub_1();
ls.add(sub_1);
}else if(targetClass.getSimpleName().equals("Sub_2")){
Sub_2 sub_2=new Sub_2();
ls.add(sub_2);
}
return ls;
}
在上述情况下,当我向列表中添加元素时出现编译错误。
ls.add(sub_1);
ls.add(sub_2);
现在解决这个问题看起来很有挑战性。如果有人可以在这里提供一些提示,我会很高兴。
谢谢!!
【问题讨论】:
-
ls.add((T) sub_1);但是为什么要测试类的简单名称而不是测试类是 Sub_1 还是 Sub_2?targetClass.equals(Sub_1.class). -
你的实际 T 是多少?
-
T extends Root,Sub_1 extends Root,Sub_2 extends Root。这并不意味着Sub_1就是T。但它是Root。也许你想要List<Root> ls = ...? -
@JBNizet 是的,我也可以将其用作
targetClass.equals(Sub_1.class)。现在我主要关心的是添加元素。 -
@ZaksM 你可以抑制警告。当你知道自己在做什么时,你不应该担心它。
标签: java generics collections