Java泛型:如何在没有原始类型的情况下转换为(T扩展Comparable <! - ?super T - >)

时间:2011-02-16 13:21:55

标签: java generics casting warnings raw-types

我想知道是否可以将非Comparable转换为某种东西,以便它与模板类型为<T extends Comparable<? super T>>的方法参数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()方法。

3 个答案:

答案 0 :(得分:3)

将其投放到

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

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

根据您在 EDIT 中提到的内容,最终您想要做这样的事情吗?

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

答案 1 :(得分:1)

这当然是不可能的。 Collections.sort需要Comparable才能调用compareTo()方法。那么在你的意见中,当排序得到一组不可比较的对象时会发生什么?

例如,根据参考文献,您可能希望使用类似默认排序的内容。但这种事情并不存在。虽然,它可以实现。但我怀疑这是你想要的吗?那你为什么要首先对列表进行排序呢?这些元素应该如何排序?

答案 2 :(得分:1)

这将在Eclipse中编译:

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

您将收到一个“类型安全:未选中”警告,您可以使用此方法进行抑制:

@SuppressWarnings("unchecked")

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