2017-05-11 6 views
6

Imは、以下の方法での作業:アレイ型の期待[コンパイルエラー]

public void m(List<? extends Object[]> objs){ 
    objs.stream() 
     .map(oa -> oa[0]) //compile error 
          //array type expected 
     .forEach(System.out::println); 

} 

DEMO

なぜそれが機能しないのですか?私は配列を拡張するすべてが配列として見ることができると思った。実際には私はlengthを配列から得ることができます。

+1

Downvoter、あなたはとても親切にし、それが動作しない理由をコメントで説明するだろう:?各配列は、あなたがメソッドを入力使用する必要があります例えばMyClass[].class

、固定型と、独自のクラスを持っていますかなぜ私は明示的に 'Object []'にキャストする必要がありますか? –

+3

'm(List <?extends Object []> objs)'を 'm(List objs)'に変更した場合、コンパイルされますが、この変更の意味や間違ったことを理解していないのであなたのオリジナルと一緒に。 –

+0

@StephenPあいにく私は署名を変更できません。 –

答えて

5

実際にはObject[]を拡張するクラスはありません。

public <T> void m(List<T[]> objs){ 
    objs.stream() 
      .map(oa -> oa[0]) // no compile error 
      .forEach(System.out::println); 

} 
+1

abtとは考えていませんが、実際にはclass MyClass extends Object [] {} 'はコンパイルされません。 –

+0

@ St.Antario配列は 'native' implです - あなたは何もできません。 – Bohemian

+2

@Bohemian nitは、それを排除する実装理由ではなく、仕様によって禁止されています。 (私の電話でJLSの該当するセクションを見つけることができません...) –

関連する問題