![](/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.