簡體   English   中英

Java泛型:如何在沒有原始類型的情況下轉換為(T擴展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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM