这应该是一个相对简单的问题。但我有这个代码,我想将链表转换为类型数组。我认为它应该可行,但由于类转换问题而无法编译。
setSelectedOptions
的方法签名需要Long[] arg1
,但编译器抱怨,因为list.toArray()
签名返回Object[]
。
我检查了另一个问题:How to convert linkedlist to array using `toArray()`? - 它表示toArray应该返回一个类型列表。
任何人都可以建议为什么它不起作用? (注意我试图将数组参数显式地转换为Long []并得到一个类转换异常)
if (selectedOptions == null)
{
// set up the carrier delivery options transient option.
List<Long> list = new LinkedList<Long>();
for (CarrierDeliveryMethodOptionValue cdv: carrierOptionValues)
{
list.add(cdv.getId());
}
setSelectedOptions(list.toArray());
}
答案 0 :(得分:3)
使用list.toArray(new Long[0]);
。
或者,对于非常轻微的效率增益(仅分配一个数组而不是两个),请使用list.toArray(new Long[list.size()])
。
答案 1 :(得分:2)
基本上你使用toArray
的错误重载。您想要the one accepting an array T[]
,声明它也会返回T[]
。它使用数组的执行时类型来计算要创建的数组类型 - 它不能在没有额外信息的情况下执行此操作,因为LinkedList
本身并不是&#39;#34;知道&#34;它的元素类型。 (那种类型的擦除。)
你可以将任何长度的数组传递给它 - 如果有必要,它会创建一个新数组 - 所以这可行:
setSelectedOptions(list.toArray(new Long[0]));
但是为了提高效率,你可能想要传递一个尺寸合适的尺寸:
setSelectedOptions(list.toArray(new Long[list.size()]));
与性能一样,您需要在效率与可读性之间取得平衡,具体取决于您在调用size()
时对可用性的影响程度与您在上下文中的效果有多重要。
请注意,如果您的setSelectedOptions
方法实际采用long[]
代替Long[]
,则您需要单独转换数组 - 自动-unboxing仅适用于单个项目,而不适用于整个数组。
答案 2 :(得分:2)
根据调用List.toArray()
的相应JavaDoc返回Object[]
,这就是List.toArray(T[])
...
<强> TL;博士强>
更改
setSelectedOptions(list.toArray());
到
setSelectedOptions(list.toArray(new Long[0]));