为什么新的 Java 8 流在 toArray 调用上返回对象数组?

2022-09-04 05:45:02

当我在一个涉及Java 8新流的项目上工作时,我注意到当我调用一个流时,它会返回一个而不是.尽管我很惊讶,但我开始深入研究Java 8的源代码,找不到任何理由为什么他们没有实现为.这背后是否有任何原因,或者它只是一种(不)一致性?Stream#toArray()Object[]T[]Object[] toArray();T[] toArray();

编辑1:我注意到在答案中很多人说这是不可能的,但是这个代码片段编译并返回预期的结果?

import java.util.Arrays;

public class Test<R> {

    private Object[] items;

    public Test(R[] items) {
        this.items = items;
    }

    public R[] toArray() {
        return (R[]) items;
    }

    public static void main(String[] args) {
        Test<Integer> integerTest = new Test<>(new Integer[]{
            1, 2, 3, 4
        });

        System.out.println(Arrays.toString(integerTest.toArray()));
    }

}

答案 1

尝试:

String[] = IntStream.range(0, 10).mapToObj(Object::toString).toArray(String[]::new);

no-arg toArray() 方法将只返回一个 Object[],但是如果你传递一个数组工厂(可以方便地表示为数组构造函数引用),你可以得到你喜欢的任何(兼容)类型。


答案 2

这与存在的问题相同。类型擦除会阻止我们了解应返回的数组的类型。请考虑以下事项List#toArray()

class Custom<T> {
    private T t;
    public Custom (T t) {this.t = t;}
    public T[] toArray() {return (T[]) new Object[] {t};} // if not Object[], what type?
}

Custom<String> custom = new Custom("hey");
String[] arr = custom.toArray(); // fails

An 不是 a,因此无论转换如何,都不能分配给 a。同样的想法也适用于 和 。使用重载方法。Object[]String[]StreamListtoArray(..)


推荐