2016-04-28 12 views
1

ラムダ式を使用して配列をインスタンス化しようとしています。キャストされたラムダ式を使用して配列を初期化する

私が使用しようとしていますコードは次のとおりです。

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が返さ

配列は、 "[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()     
     ); 
+2

'Test []'は 'Object []'とは関係ありません。2つの間でキャストすることはできません。また、 '.toArray()'は常に 'Object []'を返します。 –

+2

関連:http://stackoverflow.com/questions/5690351/java-stringlist-toarray-gives-classcastexception –

+2

あなたの主な問題の他に、 'Stream.generate'が何かを起こす*順序付けられていない*ストリームを作成することに注意する必要がありますあなたはシーケンシャルストリームを意図していますが、保証はしていません。さらに、オブジェクトを変更するために 'map'を悪用することは、落胆したプログラミングスタイルです... – Holger

答えて

6

「テスト」のインスタンスです。

A[] toArray(IntFunction generator)メソッドを使用します。

Test[] a = Stream.generate(() -> new Test(x++, 0)) 
      .limit(10) 
      .map((Test v) -> { 
       v.a = v.a * 2; 
       return v; 
      }) 
      .toArray(Test[]::new); 
+2

' size - > new Test [size] 'の代わりに' Test [] :: new'と書くだけです。 – Holger

+2

@Holger - ヘッドアップに感謝します。 – OldCurmudgeon

関連する問題