2016-06-27 90 views
0

我很難理解使用泛型類型參數的最佳方法。如何在解釋的情況下在java中使用泛型類型聲明?

考慮一個優先級隊列的實現,該實現實現了一個接口並要求所有元素都可以與其類型進行比較。該類有一個帶有輸入類型集合的構造函數,它提供了初始元素。這裏有幾個選擇。你能解釋分歧嗎?並提供這種聲明的最一般方式?

public class HeapMinPQ<E extends Comparable<E>> implements MinPQ<E> { 
    ... 
    public HeapMinPQ(Collection<? extends Comparable<E>> source) { 
    ... 
    } 
} 


public class HeapMinPQ<E extends Comparable<E>> implements MinPQ<E> { 
    ... 
    public HeapMinPQ(Collection<? extends E> source) { 
    ... 
    } 
} 


public class HeapMinPQ<E extends Comparable<? super E>> implements MinPQ<E> { 
    ... 
    public HeapMinPQ(Collection<? extends Comparable<E>> source) { 
    ... 
    } 
} 
+0

我並不冒犯。這不是一項家庭作業。我正在接受採訪。我嘗試實現基於堆的優先級隊列。 – user2259824

+0

相關:http://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super&爲什麼最通用的類​​型是'E延伸可比較的'。 – zapl

回答

1

你的構造函數不應該使用Collection<? extends E>Collection<E>作爲參數的類型。另外,你的例子不完整。他們沒有表明這些論據是如何被使用的。

在第一種情況下,source包含保證爲capture ? of Comparable<E>類型的元素。基本類型可能會或可能不會與E兼容。因此,從source中提取元素並將其用於E實例並不一定安全。

第二,source包含保證爲capture ? of E類型的元素,這意味着基類型與E兼容。只要特定的子類型無關緊要,它就可以用於E的實例。

第三,上課時間很奇怪。它表示E與它的超類型相當,對於可比類型而言通常不是這樣。這很可能會導致你心痛,並且也不能保證基本類型的source將與E比較或與E兼容。

一般來說,你不想在E類型的泛型中混淆E的捕獲,但是完整的細節很複雜。我建議Angelika Langer的優秀網站http://www.angelikalanger.com/,特別是http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html,以獲得更多知識,以及Developerworks和Oracle教程中的文章。

+0

請再詳細一點;第二種情況是否保證所有收集要素都可以相互比較?因爲我宣佈E在課堂宣言中是這樣的。 – user2259824