2017-05-11 27 views
6

Im pracy z następującym sposobem:typu Array oczekiwano [Błąd kompilacji]

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

} 

DEMO

Dlaczego to nie działa? Myślałem, że wszystko, co poszerza tablicę, może być postrzegane jako tablica. Właściwie mogę uzyskać length z tablicy.

+1

Downvoter, byłbyś tak miły i wyjaśnić w komentarzach, dlaczego to nie działa? Dlaczego muszę rzucić bezpośrednio na "Object []'? –

+3

Jeśli zmienisz 'm (List objs)' na 'm (List objs)' to kompiluje, ale nie odpowiadam, ponieważ nie rozumiem konsekwencji tej zmiany lub co jest nie tak z oryginałem. –

+0

@StephenP Niespodziewanie nie mogę zmienić podpisu. –

Odpowiedz

5

W rzeczywistości nie ma takiej klasy, która rozszerza Object[]; Każda tablica ma ustalony rodzaj i własną klasę, np MyClass[].class

należy użyć wpisane metody:

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

} 
+1

Nigdy nie myślałem o tym, ale w rzeczywistości 'class MyClass extends Object [] {}' nie kompiluje. –

+0

@ Tablice St.Antario są "rodzimymi" impl - nie można z nimi nic zrobić – Bohemian

+2

@ Behemian nit to nie jest powód implementacji, który wyklucza to, zabronione przez specyfikację. (Nie można znaleźć odpowiedniej sekcji JLS na moim telefonie ...) –