【发布时间】:2016-08-22 20:32:52
【问题描述】:
我正在尝试使用 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;在 person.Main.main(Main.java:37) Java 返回:1
但是如果你看一下对象类:
数组是一个“[Ljava.lang.Object;”实例
//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[]与Object[]无关:不能在两者之间转换。另外,请注意.toArray()总是返回Object[]。 -
除了您的主要问题之外,您应该注意
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;