簡體   English   中英

泛型並創建可比較的對象(Java)

[英]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.

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