如何转换List <comparative <?>&gt;列出<comparative <object>&gt;在Java?</comparative <object> </comparative <?>

时间:2013-12-03 16:46:19

标签: java generics

嗯,这将是一个非常蹩脚的问题,但是......如何将List<Comparable<?>>转换为List<Comparable<Object>>并向后转换?有没有比这更好的方法?

private List<Comparable<Object>> convertFromGeneric(List<Comparable<?>> list) {
    List<Comparable<Object>> output = new ArrayList<Comparable<Object>>();
    for(Comparable<?> el : list) {
        output.add((Comparable<Object>) el);
    }
    return output;
}

提前致谢

3 个答案:

答案 0 :(得分:2)

List<Comparable<Object>>List<Comparable<?>>这两种类型并不相同。第一个特别是可以与Object s进行比较的事物列表,而第二个是可以与您不知道的某种神秘类型进行比较的事物列表。

这种区别很微妙但很重要:如果我从列表中检索Comparable<Object>,我可以在其上调用compareTo("myString"),因为StringObject;但是如果我有一个Comparable<?>我根本无法调用它的compareTo方法,因为我知道它只会比较整数,浮点数或PeanutButterSandwich个实例。好处是,制作List<Comparable<?>>的人可以将Comparable<Integer>Comparable<String>以及Comparable<PeanutButterSandwich>添加到List<Comparable<?>>,但不能添加到List<Comparable<Object>> 1}}。

解决问题的方法取决于您要对列表执行的操作。我怀疑你想从列表中提取Comparable并将其与任意Object进行比较。如果这是您想要的,那么您需要更改接收列表的方法,以便其签名仅接受List<Comparable<Object>>,并且可能会修改首先列出的任何其他代码,以便它具有正确的类型

如果来电者真的给你一个List<Comparable<PeanutButterSandwich>>你就会遇到问题;但这是你程序中的一个基本逻辑错误。试图将随机ObjectPeanutButterSandwich进行比较,这是一个普通的旧bug,而且仿制药在这里很难实现,这是他们正确完成工作的一个症状。

答案 1 :(得分:1)

有一种更简单的方法(你没有定义好):

List<Comparable<?>>List<Comparable<Object>>

(List<Comparable<Object>>)((List)list)

PS:我测试了它。


(由MightyPork编辑↓)

以下是一个示例代码,证明它有效:

List<Comparable<?>> list = new ArrayList<Comparable<?>>();

// due to auto-boxing, those will turn into String, Integer and Boolean,
// all implementing Comparable
list.add("dfg");
list.add(1);
list.add(true);

List<Comparable<Object>> foo = (List<Comparable<Object>>)((List)list);

System.out.println(foo.get(0)); // this works

答案 2 :(得分:0)

由于泛型的工作方式(类型擦除),实际上没有安全的方法来执行此操作。您在运行时对?实际上没有任何保证。

可以尝试的内容是量化?类型。例如,您可以尝试将类型更改为List<Comparable<? extends Object>>