Java 使用强制转换的lambda表达式初始化数组

Java 使用强制转换的lambda表达式初始化数组,java,lambda,java-8,Java,Lambda,Java 8,我试图使用lambda表达式实例化一个数组 我尝试使用的代码是: public class Main { static int x = 0; public static void main(String[] args) { Test[] t = (Test[]) Stream .generate(() -> new Test(x++, 0)) .limit(10)

我试图使用lambda表达式实例化一个数组

我尝试使用的代码是:

public class Main {

    static int x = 0;

    public static void main(String[] args) {

        Test[] t = (Test[]) Stream
                .generate(() -> new Test(x++, 0))
                .limit(10)
                .map((Test v) -> {
                    v.a = v.a * 2;
                    return v;
                }) 
        );
我试图实例化的类称为Test:

public class Test {

int a, b;

 Test(int a, int b) {
    this.a = a;
    this.b = b;
 }
}
我无法执行强制转换,它引发了一个异常:

java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为 [Lperson.Test;at person.Main.Main(Main.java:37)java返回:1

但如果您查看对象类:

该数组是一个“[Ljava.lang.Object;”实例

数组的每个对象都是一个“测试”实例


您不能只是投射一个流,然后期望它成为一个数组

使用该方法


测试[]
对象[]
无关:您不能在两者之间进行强制转换。另外,请注意
.toArray()
始终返回
对象[]
.Related:除了您的主要问题之外,您应该注意,
Stream.generate
创建了一个无序流,它恰好可以实现您对顺序流的意图,但不能保证这一点。此外,滥用
map
修改对象是一种不受欢迎的编程风格……更好:
Test[]t=new Test[10];Arrays.setAll(t,ix->new Test(ix,0));for(Test v:t)v.a=v.a*2;
而不是
size->new Test[size]
你可以只写
Test[]::new
@Holger-谢谢你的提醒。
//class "[Ljava.lang.Object;"
        System.out.println(
                Stream.generate(() -> new Test(x++, 0))
                .limit(10)
                .map((Test v) -> {
                    v.a = v.a * 2;
                    return v;
                })
                .toArray().getClass()                
        );
//class "Test"
        System.out.println(
                Stream.generate(() -> new Test(x++, 0))
                .limit(10)
                .map((Test v) -> {
                    v.a = v.a * 2;
                    return v;
                })
                .toArray()[0].getClass()                
        );
    Test[] a = Stream.generate(() -> new Test(x++, 0))
            .limit(10)
            .map((Test v) -> {
                v.a = v.a * 2;
                return v;
            })
            .toArray(Test[]::new);