【问题标题】:suggest helper method for this Java Generics piece of code please请为这段 Java 泛型代码建议辅助方法
【发布时间】: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


【解决方案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;
}

【讨论】:

  • Meindratheal,感谢您的回答。很抱歉,因为我没有要求的分数,所以我无法给你的答案 +1。我现在也想知道 Kayaman 所说的“不好的通用代码”是什么意思?他指的是我的代码还是你的代码? @Kayaman 请回答:D
【解决方案2】:

使用List&lt;Number&gt; 代替List&lt;? super Integer&gt; 使其更清晰。

这样用就行了。

static List<Integer> foo(List<Integer> fillthis, List<Number> readlist) {
    for (Number i : readlist) {
        if (i instanceof Integer)
            fillthis.add(i.intValue());
    }
    return fillthis;
}

【讨论】:

  • 你对? super Integer的理解是什么?你为什么用它?你在readlist 中有什么类型的值?
  • 嗨,Braj,我用过 List super Integer> 代替 List 因为 List super Integer> 基本上意味着 List 或 List,你同意吗?但是 List OR List 可以包含一个 Integer 值,因为 Integer 是 Object 和 Number 的子类,同意吗?所以,我的第二个参数是 List super Integer> 以便用户还可以从列表中提取整数值,例如 List 我是否只使用 List 代替 List super Integer>,我无法传递 List 或 List ,因此无法从这些列表中提取整数值 我希望清除 ??
  • @Sarabjeet 好的,您的要求现在很明确。我希望你也能得到答案。
  • 实际上我没有按照我想要的方式帮助任何人? :)
  • 亲爱的,我已经知道,甚至在在这里寻求帮助之前,你一直要求我缩小我的职能范围。我只是问你是否可以向我推荐一个相同的辅助方法:D 我希望你知道 java 泛型中的辅助方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多