我想通過使用lambda表達式實例化一個數組。通過使用鑄造的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;
})
);
我試圖實例化類被稱爲測試:
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 []'。 –
相關:http://stackoverflow.com/questions/5690351/java-stringlist-toarray-gives-classcastexception –
除了你的主要問題,你應該注意'Stream.generate'創建一個* unordered *流恰好做什麼你有意使用順序流,但不能保證如此。此外,濫用'map'來修改對象是一種令人沮喪的編程風格... – Holger