ラムダ式を使用して配列をインスタンス化しようとしています。キャストされたラムダ式を使用して配列を初期化する
私が使用しようとしていますコードは次のとおりです。
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;
}
}
私はキャストを実行することはできません、それは例外が発生します:
しかし、あなたがオブジェクトクラスを見れば:person.Main.main(Main.java:37)でJavaが返さjava.lang.ClassCastException:[Ljava.lang.Object;キャストすることはできません [Lperson.Test;
配列は、 "[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 []'とは関係ありません。2つの間でキャストすることはできません。また、 '.toArray()'は常に 'Object []'を返します。 –
関連:http://stackoverflow.com/questions/5690351/java-stringlist-toarray-gives-classcastexception –
あなたの主な問題の他に、 'Stream.generate'が何かを起こす*順序付けられていない*ストリームを作成することに注意する必要がありますあなたはシーケンシャルストリームを意図していますが、保証はしていません。さらに、オブジェクトを変更するために 'map'を悪用することは、落胆したプログラミングスタイルです... – Holger