2016-10-06 117 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方法的调用之前,该类型转换将继续,因为,由于类型擦除的正确性在演播室不能检查演员(关于元素类型)。这就是为什么在执行这种类型转换时,您会在编译时得到“未经检查”的警告。

因此,您必须通过查找“未选中”或“原始类型”警告来搜索问题的原因,并确认这些警告没有关闭。