将链表转换为类型化数组

时间:2015-01-16 06:52:41

标签: java

这应该是一个相对简单的问题。但我有这个代码,我想将链表转换为类型数组。我认为它应该可行,但由于类转换问题而无法编译。

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());
}

3 个答案:

答案 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]));
相关问题