[英]Creating an array of generic type
假設我想通過默認構造函數創建一個長度為5的數組
public class A <E extends Comparable<? super E>> implements B<E>
{
private E[] myArray;
public A()
{
myArray = (E[]) new Object[5];
}
}
這是正確的做法嗎? 我很困惑,我是否必須在[]之前陳述“可比較”。 所以
private Comparable[] myArray;
不。 它將在運行時拋出ClassCastException
讓我們看看原因。 因為<E extends Comparable<? super E>>
<E extends Comparable<? super E>>
,一旦所有泛型類型被編譯器擦除, E
將被類中的Comparable
替換。
因此,在您的構造函數中,這主要是在運行時發生的:
myArray = new Comparable[5];
這是錯誤的,因此是例外。
它將與class A <E> implements B<E>
所以解決方案是:
class A <E extends Comparable<? super E>> implements B<E>{
Comparable[] array;
public A(){
array = new Comparable[5];
}
@SuppressWarnings("unchecked")
E get(int x)
{
return (E) array[x];
}
void add(E b){
//for now
array[0] = b;
}
您發布的代碼的問題是E[]
的擦除是Comparable[]
(因為E
的上限是Comparable
),因此將實際類型為Object[]
為Comparable[]
將失敗。
您可以簡單地將其更改為以下內容,它不會拋出異常:
public class A <E extends Comparable<? super E>> implements B<E>
{
private E[] myArray;
public A()
{
myArray = (E[]) new Comparable[5];
}
}
但是,這里有更多的細微之處: myArray
實際上不是E[]
類型。 在課堂內, E[]
被刪除為Comparable[]
,所以沒關系。 但是你必須確保永遠不要將myArray
暴露給課外。 由於它是私有的,你只需要確保沒有方法返回它或什么。
這樣做的好處是,保持myArray
類型為E[]
,而不是Jatin使用Comparable[]
的答案,就是你不必每次從中獲取某些內容時都要進行轉換,因此代碼更好。
正如@Jatin指出的那樣,如果將Object
強制轉換為Comparable
,則將獲得運行時異常,因為它是Comparable
父級,因此無法強制轉換為子類型。
我建議你盡可能使用ArrayList
:
例如
public class A <E extends Comparable<? super E>> implements B<E> {
private List<E> myArray;
public A() {
myArray = new ArrayList<E>();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.