将字节转换为字节错误

时间:2016-10-06 19:00:18

标签: casting java-8

我收到此错误

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 个答案:

答案 0 :(得分:1)

异常消息有点难以阅读,因为它使用了类的binary name。二进制名称[Ljava.lang.Byte;实际上意味着java.lang.Byte[],即您尝试隐式转换为Byte的{​​{1}}个对象数组。

在正常操作下,通用代码的隐式转换应该永远不会抛出Byte,这种安全性是泛型的目的。但是,如果执行未经检查的操作,则此保证可能会丢失。

由于在您发布的代码中,未识别出未经检查的操作,因此未经检查的操作必须在不产生异常的情况下发生,但会使程序处于不一致状态,从而破坏通用类型安全性。这种情况称为堆污染

例如,如果列表实际上包含ClassCastException个实例,并且在调用Transition<Byte[]>方法之前有一个类型转换为ArrayList<Transition<Byte>>,则该类型转换将继续进行,因为,由于类型擦除,在运行时无法检查强制转换的正确性(关于元素类型)。这就是为什么在执行这样的类型转换时在编译时会得到“未经检查”的警告。

因此,您必须通过查找“未选中”或“原始类型”警告来检查问题的原因,并验证这些警告是否未关闭。