请为此Java Generics代码提供帮助方法

时间:2014-05-03 14:46:10

标签: java generics java-6 helpermethods

我不小心写了这段代码。

   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);
}

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

2 个答案:

答案 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;
}