3 回答
TA贡献2037条经验 获得超6个赞
您的方法返回一个 raw ArrayList,这就是编译器允许它的原因。但是,在运行时,会尝试将 a LinkedList(您传递给getBatches方法的实例)强制转换为ArrayList,从而导致ClassCastException.
如果您将方法更改为:
private static ArrayList<ArrayList<Integer>> getBatches(List<Integer> optionIds) {
return new ArrayList<>(Arrays.asList(optionIds));
}
你会得到一个编译错误。
为了避免编译和运行时错误,您需要将List传递给您的方法的 转换为ArrayList:
private static ArrayList<ArrayList<Integer>> getBatches(List<Integer> optionIds) {
return new ArrayList<>(Arrays.asList(new ArrayList<>(optionIds)));
}
这将返回一个 ,ArrayList其单个元素是ArrayList包含与List传递给方法的元素相同的元素。
TA贡献1839条经验 获得超15个赞
getBatches()
正在返回一个具有泛型类型的 ArrayList ArrayList<Integer>
。的返回类型Arrays.asList()
是一个List
接口。为了从 List 到 ArrayList 它进行了隐式转换。问题在于您不能直接将 ArrayList 转换为 LinkedList。
解决这个问题相对简单。不是遍历ArrayList
s,而是遍历List
seg for(List l: getBatches(a)
。然后就getBatches()
返回ArrayList<List<Integer>>
通常,您会希望尽可能使用最抽象的东西。如果您不需要实现特定的细节,ArrayList
只需将其称为列表。
TA贡献1859条经验 获得超6个赞
这是使用原始类型的结果。
通过调用new ArrayList(...)
无specifing泛型参数T
的ArrayList<T>
您正在使用的原始类型ArrayList
。
上面链接的文档说:
但是,如果将原始类型分配给参数化类型,则会收到警告:
Eclipse 显示以下与以下相关的警告new ArrayList(Arrays.asList(optionIds));
:
类型安全:类型的表达
ArrayList
需要未经检查的转换以符合ArrayList<ArrayList<Integer>>
因此,返回原始类型ArrayList
为ArrayList<ArrayList<Integer>>
.
的结果getBatches(a)
是 类型ArrayList<ArrayList<Integer>>
。此类型列表的元素类型为ArrayList<Integer>
。将它们分配给ax
使用原始类型ArrayList
也没有编译时错误。
为了向后兼容,允许将参数化类型分配给它的原始类型:
但在运行时,当涉及到的元素的投getBatches(a)
给ArrayList
无视该警告导致ClassCastException
,因为运行时类型LinkedList
不能被强制转换为ArrayList
(此时已经与擦除泛型类型)。
添加回答
举报