【发布时间】:2014-05-03 14:46:09
【问题描述】:
我不小心写了这段代码。
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 列表或其任何超类型,例如 Object 列表;然后从“readList”中提取每个 int 值并将其放入给定的 int 列表“fillthis” 我使用 List 是因为即使是 List 或 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);
}
问题很简单:我们可以创建一个辅助方法来让这个方法完全按照它的方式工作吗?
【问题讨论】:
-
嗨@Kayaman 感谢您有兴趣回答我的问题:) 问题是它将第一个参数作为整数列表,第二个参数是整数列表或任何超类型整数的列表[比如说一个数字或对象],因为数字或对象列表也可以包含一个整数值,我希望它现在清楚
标签: java generics java-6 helpermethods