1

我不小心写了这段代码。

   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 List 'fillthis' 我使用 List 因为即使是 List 或 List 也可以包含一个整数

当然,它不会编译,因为编译器不会让 'readList' 中的未验证值进入纯 int List '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,我不知道它如何影响我通过的列表类型!当然,我可以听从你的建议并传递一个 List 和 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);
}

问题很简单:我们可以创建一个辅助方法来使这个方法完全像它一样工作吗??

4

2 回答 2

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;
}
于 2014-05-03T14:50:49.067 回答
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;
}
于 2014-05-03T15:19:23.480 回答