我不小心写了这段代码。
static List<Integer> foo(List<Integer> fillthis,List<? super Integer> readlist){
for(Object i:readList){
if(i instanceof Integer)
fillthis.add(i);
}
return fillthis;
}
正如您所看到的,它基本上采用了Integer和另一个Integer列表或其任何超类型的列表,比如List of Object;然后从'readList'中提取每个int值并将其放入给定的int列表'fillthis' 我使用List,因为即使列表或列表也可以包含整数
当然,它不会编译,因为编译器不会将未经验证的值从'readList'转换为纯int列表'fillthis'。 所以它最终给了我一个典型的错误:
actual argument Object cannot be converted to Integer by method invocation conversion
但是,倾向于考虑它,如果只有一个可以借助辅助方法解决这个问题,这是一个非常合理的代码片段 有人可以帮忙吗?我已经尝试过我的智慧结束了
非常感谢你:)
编辑------------------
感谢Meindratheal, 但是,如果我不想进行类型转换,那么任何人都可以建议这个方法的辅助方法 因为 像
这样的辅助方法static <T,U super T> List<T> foo(List<T> fillthis,List<U> readList);
不起作用 因为泛型不允许在类型参数列表中使用“超级”。它只允许扩展 还有,这个甚至还有一个帮助方法。
请建议:)
更新
Braj,我不知道它会如何影响我传递的名单! 当然,我可以听从你的建议并传递一份清单 和TBH,这段代码不是任何严肃的软件设计 但是亲爱的,这个非常简单的问题确实挑战了我们对java泛型的了解
也许在上面再次阅读我的代码 我猜你已经知道我的问题是什么
好的, 让我说我有
public static void main(String[] args){
List<Integer> lint=Arrays.asList(1,2,3);
List<Object> lobj=new List<Object>();
lobj.add(new Object());
lobj.add(new Integer(4)); /*will compile perfectly. had I used List<? super Integer> instead of List<Integer>, I can't pass lobj to extract this value of 4. Clear?? */
foo(lint,lobj);
}
问题很简单:我们可以创建一个辅助方法来使这个方法完全像它一样工作吗?
答案 0 :(得分:1)
你必须将i
强制转换为整数:
static List<Integer> foo(List<Integer> fillthis,List<? super Integer> readlist){
for(Object i:readList){
if(i instanceof Integer)
fillthis.add((Integer) i);
}
return fillthis;
}
答案 1 :(得分:0)
使用List<Number>
代替List<? super Integer>
,以使其更加清晰。
只需以这种方式使用。
static List<Integer> foo(List<Integer> fillthis, List<Number> readlist) {
for (Number i : readlist) {
if (i instanceof Integer)
fillthis.add(i.intValue());
}
return fillthis;
}