我收到此错误
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();
}
为什么呢?我做的事明显吗?这些功能是复杂库的一部分,我不喜欢摆弄它们的实现。
答案 0 :(得分:1)
异常消息有点难以阅读,因为它使用了类的binary name。二进制名称[Ljava.lang.Byte;
实际上意味着java.lang.Byte[]
,即您尝试隐式转换为Byte
的{{1}}个对象数组。
在正常操作下,通用代码的隐式转换应该永远不会抛出Byte
,这种安全性是泛型的目的。但是,如果执行未经检查的操作,则此保证可能会丢失。
由于在您发布的代码中,未识别出未经检查的操作,因此未经检查的操作必须在不产生异常的情况下发生,但会使程序处于不一致状态,从而破坏通用类型安全性。这种情况称为堆污染。
例如,如果列表实际上包含ClassCastException
个实例,并且在调用Transition<Byte[]>
方法之前有一个类型转换为ArrayList<Transition<Byte>>
,则该类型转换将继续进行,因为,由于类型擦除,在运行时无法检查强制转换的正确性(关于元素类型)。这就是为什么在执行这样的类型转换时在编译时会得到“未经检查”的警告。
因此,您必须通过查找“未选中”或“原始类型”警告来检查问题的原因,并验证这些警告是否未关闭。