嗯,这将是一个非常蹩脚的问题,但是......如何将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;
}
提前致谢
答案 0 :(得分:2)
List<Comparable<Object>>
和List<Comparable<?>>
这两种类型并不相同。第一个特别是可以与Object
s进行比较的事物列表,而第二个是可以与您不知道的某种神秘类型进行比较的事物列表。
这种区别很微妙但很重要:如果我从列表中检索Comparable<Object>
,我可以在其上调用compareTo("myString")
,因为String
是Object
;但是如果我有一个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>>
你就会遇到问题;但这是你程序中的一个基本逻辑错误。试图将随机Object
与PeanutButterSandwich
进行比较,这是一个普通的旧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>>
。