![](/img/trans.png)
[英]Generics in Java - Why I am not allowed to do Comparable<? extends T> instead of Comparable<? super T>?
[英]Java generics: How to cast to (T extends Comparable<? super T>) without raw-types
我想知道是否有可能将非Comparable转换为某种东西,以便它匹配方法参数T,它具有模板类型<T extends Comparable<? super 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>)
,我可以这样做,但是这会生成一个警告我正在使用raw-types(在这种情况下,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()
方法。 那么在你的意见中,当排序得到一组不可比较的对象时会发生什么?
例如,根据参考文献,您可能希望使用类似默认排序的内容。 但这种事情并不存在。 虽然,它可以实现。 但我怀疑这是你想要的吗? 那你为什么要首先对列表进行排序呢? 这些元素应该如何排序?
这将在Eclipse中编译:
List<?> foo = new ArrayList<Object>();
Collections.sort((List<Comparable>) foo);
你会得到一个“类型安全:未选中”警告你可以用这个来抑制:
@SuppressWarnings("unchecked")
这将让你调用sort。 这就是你要找的东西吗? 当然,不能保证它在运行时是安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.