我想知道是否可以将 non-Comparable 转换为某种东西,以便它与具有模板类型的方法参数 T 匹配 <T extends Comparable<? super T>>, , 像 Collections.sort() 方法

public static <T extends Comparable<? super T>> void sort(List<T> list)

假设我在某个地方引用了非可比对象列表,并且想要通过如下所示的转换来调用该方法:

List<E> foo = new List<E>(a);
Collections.sort( /* magic cast */ foo);

如果我投射到,我可以做到这一点 (List<? extends Comparable>), ,但这会生成一个警告,表明我正在使用原始类型(在这种情况下可以与没有模板类型的情况进行比较)。假设我想避免使用原始类型,甚至通过以下方式抑制它们 @SuppressWarnings("rawtypes") (例如。以保持向后兼容性并避免原始类型)。

是否可以通过强制转换来避免使用原始类型 (List<? extends Comparable</*something*/>>) 那“东西”会是什么(未经检查的演员阵容是可以接受的)?

编辑:这个例子只是为了说明这一点。实际上我没有 Comparable 也不想对任何东西进行排序,但我只需要动态检查某些东西是否属于某种类型(在本例中为 Comparable)(通过 instanceof),然后将一些参数传递给具有模板参数的方法类似于 Collections.sort() 方法。

有帮助吗?

解决方案

将其投射到

Collections.sort((List<Comparable<Object>>) list);

这不会给出“rawtype”警告。只有一个“未经检查的演员”警告(无论如何你都会收到。)

从你提到的情况来看 编辑, ,最终你想做这样的事情吗?

if(!list.isEmpty() && list.get(0) instanceof Comparable){
    List<Comparable<Object>> cmprList = (List<Comparable<Object>>)list;
    Collections.sort(cmprList);
}

其他提示

这当然是不可能的。 Collections.sort 需要 Comparable 为了调用 compareTo() 方法。那么在您看来,当 sort get 是不可比较对象的集合时会发生什么?

您可能想要使用类似于默认排序的东西,例如基于参考。但这样的事情并不隐含地存在。不过,它是可以实施的。但我怀疑这就是你想要的吗?那么为什么要首先对列表进行排序呢?那么这些元素应该如何排序呢?

这将在 Eclipse 中编译:

List<?> foo = new ArrayList<Object>();
Collections.sort((List<Comparable>) foo);

您将获得“类型安全:未选中”警告,您可以通过以下方式抑制:

@SuppressWarnings("unchecked")

这会让你调用排序。这就是您要找的吗?当然,不能保证它在运行时是安全的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top