java8流api抛出不兼容的类型:将String数组转换为Integer数组时,Object []无法转换为Integer []

时间:2019-02-20 14:47:45

标签: java java-8 java-stream

我的以下代码:

String[] valStrs=data.split(";");//data is a string
Integer[] vals=Arrays.stream(valStrs).map(Integer::valueOf).toArray();

抛出:

error: incompatible types: Object[] cannot be converted to Integer[] [in Codec.java]
        Integer[] vals=Arrays.stream(valStrs).map(Integer::valueOf).toArray();

我想我正在尝试获取String流,然后通过StringInteger映射到Integer::valueOf中,并将这些Integer收集到一个数组中。

那么为什么会出现这个错误?快速搜索,却找不到答案。


更新:

int[] arr= Arrays.stream(valStrs).mapToInt(Integer::parseInt).toArray();可以正常工作。

1 个答案:

答案 0 :(得分:2)

您必须像这样将构造函数引用传递给toArray中的整数数组。否则,它将默认创建一个Object[]

Arrays.stream(valStrs).map(Integer::valueOf).toArray(Integer[]::new);

mapToInt创建一个IntStream,它的toArray()函数返回一个int[]。这是声明。

int[] toArray();

相反,除非另有说明,否则map(Integer::valueOf)创建一个Stream<Integer>,并且toArray返回一个Object[]。这是实现。

@Override
public final Object[] toArray() {
    return toArray(Object[]::new);
}

调用toArray(Integer[]::new)将调用此重载方法。

public final <A> A[] toArray(IntFunction<A[]> generator)

这里是文档摘录。

  

使用,返回包含此流元素的数组。   提供了生成器函数来分配返回的数组。

     

generator一个产生所需类型的新数组的函数   以及提供的长度