簡體   English   中英

通用數組和通用值有什么區別?

[英]What's the difference between the generic array and the generic value?

public class Array<T> {
    private Object[] array;
    public Array(int sz) {
        array = new Object[sz];
    }
    // ....
    public T get(int index) { return (T)array[index]; }
    public T[] rep() { return (T[])array; } 
}

為什么編譯器說(T[])array是未經檢查的強制轉換,然后在我使用rep()方法時引發ClassCastException 當我使用get()方法()時為什么不拋出此異常?

為什么在我使用get()方法()時未引發此異常?

有兩個原因 :

  1. 假設您的程序中未向array添加任何元素,則將使用sznull值初始化array 。. (T)array[index]語句試圖將null轉換為T (其中T本質上是通過類型擦除替換為Object )。 可以將null強制轉換為任何類型,因此這不是問題。
  2. 假設您的程序中將一些元素添加到array中,則語句(T)array[index]可以正常工作的唯一方法是,位置index處的元素是否是用於實例化Array的相同類型或子類型(例如Array<Number> arr = new Array<Number>arr[index]為1。這不是問題;但是,嘗試在arr[index]處插入一個String ,您肯定會從get ClassCastException 。方法)

為什么編譯器說(T [])數組是未經檢查的強制轉換,然后在我使用rep()時拋出ClassCastException

獲得ClassCastException的唯一方法是T表示的類型與array可以容納的元素的類型不同。 例如,執行以下操作將導致ClassCastException

Array<Integer> a = new Array<Integer>();
Integer[] intArray = a.rep();//ClassCastException

在這里, T[]表示一個Integer[]因此在編譯代碼時沒有問題。 但是,在運行時, array的類型為Object[] Object數組不能向下轉換為Integer數組。 知道數組是由JVM與其他類不同的動態創建的,這也將有所幫助。

解決此問題的一種方法是將Array實例化為Array<Object> arr = new Array<Object>

get() ,您只關心數組中元素的實際運行時類型,我認為這是正確的,因為您有某種方法只能將T放入數組中。 數組的實際運行時類型無關緊要。

rep() ,您關心數組對象的實際運行時類型,因為您將其強制轉換為T[] 您使用實際的運行時類型Object[]創建了數組,因此,除非T恰好是Object否則對T[]的強制轉換將始終不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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