這個問題在這里已經有了答案: 將物件陣列轉換為整數陣列錯誤 5 個答案 為什么不能將 Object[] 轉換為 String[] 6 個答案 16 小時前關閉。
這個問題困擾了我一段時間。考慮一下:
以下代碼可以正常作業:
Object obj = 0.0;
Double dble = (Double) obj;
System.out.println(dble);
正如預期的那樣,我可以將包含雙精度值的物件轉換為非原始型別雙精度。
但是這段代碼因類轉換例外而中斷:
Object[] objArr = {0.0};
Double[] dbleArr = (Double[]) objArr;
System.out.println(dbleArr[0]);
java.lang.ClassCastException:[Ljava.lang.Object;不能轉換為 [Ljava.lang.Double
演員不應該以同樣的方式作業,無論它是否是一個陣列?我經常在擴展 Object 的各種型別中遇到這個問題,并且通常只是為每種型別撰寫多載函式,而不是使用通用的“Object []”。但我非常想了解正在發生的事情。
uj5u.com熱心網友回復:
這是一個快速的思想實驗,您可以進行以確定強制轉換或泛型在某些情況下是否有效。它基本上表明使用 reductio ad absurdum 的演員是非法的:
Object[] objArr = {0.0};
Double[] dblArr = (Double[])objArr;
objArr[0] = Long.valueOf(0);
顯然最后一行將使陣列不再是 a Double[],這意味著第二行不能被允許。
看看相反的情況也很有趣:
Double[] dblArr = {0.0};
Object[] objArr = (Object[])dblArr;
objArr[0] = Long.valueOf(0);
只有最后一行有問題,所以它是非法的 ( StoreException)。前兩行很好,因為您不能將非物件放入 via dblArr。
uj5u.com熱心網友回復:
作為一般規則,您可以將物件x轉換為 Java 中的類Y,如果它的運行時類是Y(忽略原始型別,它們有不同的規則并且在這里不相關)的子類。
在這種情況下,運行時類obj是Double,因此可以將其強制轉換為Double; objArris的運行時類Object[],它不是它的子類,Double[]也不能轉換為它。
為了更詳細地解釋,主要的相關概念是自動裝箱。這意味著當編譯器看到
Object obj = 0.0;
它插入
Object obj = Double.valueOf(0.0);
使用Double valueOf(double d)方法。這會回傳 a Double(不出所料),因此可以強制轉換為Double.
Object[] objArr = {0.0};
也可以有效地裝箱0.0并變得
Object[] objArr = new Object[1];
objArr[0] = Double.valueOf(0.0);
所以它創建一個Object[],而不是一個Double[]。
你也可以通過這樣做看到這一點
System.out.println(obj.getClass());
System.out.println(objArr.getClass());
你會得到
class java.lang.Double
和
class [Ljava.lang.Object;
分別。
uj5u.com熱心網友回復:
Double[] dbleArr = Arrays.copyOf(objArr, objArr.length, Double[].class);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/413813.html
標籤:
