[英]Generics and creating a comparable object (Java)
public class ArrayHeap<T extends Comparable<T>> implements Heap<T>{
...
public ArrayHeap(int capacity){
heap = (T[]) new Comparable[capacity];
}
嗨,在堆= ...上有一個簡單的問題,所以在課堂上,我們一直在討論堆,並使用數組(使用泛型類型)實現堆。 僅做一些檢查,就無法了解第5行的實際情況。
因此,我們無法創建通用類型的對象,通常我希望看到:
heap = (T[]) new Object[capacity]
即,如果我要閱讀本節及其內容:將堆設置為將新Object強制轉換為類型T的通用數組的結果,並將大小設置為容量。
我的問題是,怎么行:
heap = (T[]) new Comparable[capacity];
被閱讀? 是創建新的Comparable對象還是實現可比較接口的新對象?
new Comparable[N]
將創建一個陣列N
可容納元件Comparable
或任何亞型Comparable
。 沒有創建Comparable
,只是一個數組。
對於轉換,通常,如果您執行了(String[]) new Comparable[N]
,則會得到ClassCastException
因為它不是有效的轉換。 但是,對T[]
的強制轉換未經檢查,這意味着強制轉換在表達式的特定位置不會發生。 取而代之的是 ,將ArrayHeap
類型轉換刪除,並且在ArrayHeap
類之外的其他地方,有一些類似以下的代碼:
ArrayHeap<String> h = ...;
String s = h.get(...);
並且在編譯過程中將其替換為以下內容:
ArrayHeap h = ...;
String s = (String) h.get(...);
因此,我們可以說它有點像(T[])
強制轉換。
但是,要點是,當您執行(T[]) new Comparable[N]
時,實際上並沒有得到T[]
(T[]) new Comparable[N]
。 您只是在欺騙編譯器,以便在ArrayHeap
類的主體內提供更好的靜態類型檢查。 如果您嘗試將Comparable[]
作為T[]
返回給外界,則會出現異常。
它正在創建一個可以容納Comparable
對象的數組。 重要的一點是, 只允許數組容納Comparable
對象。 new Object[capacity]
將被允許容納任何東西。
您真正想要的是一個T[]
-意味着,該數組僅限於容納應該與堆一起使用的特定類型T
但這是不可能的,因為Java的泛型是如何工作的( 類型擦除 )。 由於T
是實現Comparable
所必需的,因此,下一個最好的事情是Comparable
的數組。
但是,這仍然很尷尬,並且您會從編譯器收到有關將Comparable
用作原始類型的警告。 最好將heap
定義為List<T>
,並使用new ArrayList<>(capacity)
對其進行初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.