java - 如何使以下分配合法化?
问题描述
以下产生了 ClassCastException,我无法确定原因。我知道泛型数组有点禁忌,因为它具有不变性与协变性属性,并且泛型不是可重构的,但不明白为什么会生成 RuntimeException。
...
Integer[] sap = (Integer[]) iterableToArray(path.pathTo(w));
}
private <T> T[] iterableToArray(Iterable<T> it){
ArrayList<T> list = new ArrayList<>();
for(T o : it)
list.add(o);
return (T[]) list.toArray();
}
解决方案
你可以这样做:
private static <T> T[] iterableToArray(Iterable<T> it, T[] arrayTemplate){
ArrayList<T> list = new ArrayList<>();
for(T o : it)
list.add(o);
return list.toArray(arrayTemplate);
}
并这样称呼它:
Integer[] sap = iterableToArray(path.pathTo(w), new Integer[0]);
您必须传递一个具有具体类型的变量 for T
,因为该方法iterableToArray
需要一个来创建数组。您不需要转换 的结果iterableToArray
,因此这种用法是类型安全的。
该变量arrayTemplate
仅用于将类型传递给方法。由于结果不适合大小为 0 的数组,因此该方法toArray
创建了一个新数组。这通常比将所需大小的数组传递给方法要快toArray
。而且它也更简单。所以这是首选的方法。
推荐阅读
- python - 尝试在熊猫中使用聚合求和函数
- python - ReadTimoutError 在 selenium 中打开多个 webdrivers
- node.js - SPDY + Express:从服务器下载的 zip 文件已损坏
- python - matplotlib 交换 x 和 y 轴
- docker - 每当我运行 Docker 容器时获取“/usr/bin/python: No module named”
- c++ - C++ 池分配器程序仅在控制台关闭时崩溃
- javascript - Angular http 模块 - 发布标题
- java - scala类成员导致错误“类'类'必须声明为抽象或实现成员'成员'”
- dialogflow-es - 在 Actions on Google 中使用单个话语调用多个意图
- regex - 在引号中动态包装子字符串