2016-10-06 151 views
0

我得到這個錯誤鑄造逐字節錯誤

java.lang.ClassCastException: [Ljava.lang.Byte; cannot be cast to java.lang.Byte 

在返回通用Byte功能:

public void myFunction(ArrayList<Transition<Byte>> transitions){ 
    Transition<Byte> someObject = transitions.get(0); 
    Byte [] actions = new Byte[1]; 
    actions[0] = someObject.getAction(); 
} 

爲什麼?我做了些明顯的事情嗎?這些函數是複雜庫的一部分,我不想擺弄他們的實現。

+1

'[Ljava.lang.Byte;'意味着'Byte []',即一個'Byte'對象的數組。 – Holger

+2

由於在這段代碼中沒有可以識別的未經檢查的操作,所以必須在靜默之前發生。這種情況稱爲*堆污染*。 – Holger

回答

1

異常消息有點難以閱讀,因爲它使用了類的binary name。二進制名稱[Ljava.lang.Byte;實際上表示java.lang.Byte[],即您嘗試隱式投射到ByteByte對象的陣列。

在正常操作下,通用代碼的隱式轉換決不應該拋出ClassCastException,這種安全性是泛型的目的。但是,如果執行未執行操作,則此擔保可能會丟失。因爲在您的發佈代碼中,沒有未經檢查的操作是可識別的,未經檢查的操作必須發生在未發生異常的情況下,但會使程序處於不一致的狀態,從而破壞通用類型安全性。這種情況被稱爲堆污染

例如,如果列表實際上包含Transition<Byte[]>情況下,有是列表的類型轉換爲ArrayList<Transition<Byte>>myFunction方法的調用之前,該類型轉換將繼續,因爲,由於類型擦除的正確性在演播室不能檢查演員(關於元素類型)。這就是爲什麼在執行這種類型轉換時,您會在編譯時得到「未經檢查」的警告。

因此,您必須通過查找「未選中」或「原始類型」警告來搜索問題的原因,並確認這些警告沒有關閉。