2013-04-03 17 views
34

Mam metoda przekazujących kolekcję klasy bazowej:Czy istnieje sposób, aby wymusić typ zwracanej Arrays.asList

import java.util.*; 
class Base { } 
class Derived extends Base { } 

Collection<Base> getCollection() 
{ 
    return Arrays.asList(new Derived(), 
         new Derived()); 
} 

To nie skompilować, jak typ powrót Arrays.asList (List<Derived>) robi nie pasuje do typu zwrotu metody (Collection<Base>). Rozumiem, dlaczego tak się dzieje: ponieważ typy ogólne są różne, te dwie klasy nie są powiązane przez dziedziczenie.

Istnieje wiele sposobów na naprawienie błędu kompilatora poprzez zmianę typu zwracanego metody, aby nie używać pola Arrays.asList do rzutowania jednego z obiektów pochodnych na składnik Base.

Czy istnieje sposób, aby kompilator mógł użyć innego, ale kompatybilnego typu, gdy rozpatruje typ ogólny dla wywołania Arrays.asList? (Ciągle stara się wykorzystać ten wzór i działa w ten problem, więc jeśli istnieje sposób, aby to działało, chciałbym to wiedzieć.)

Myślałem, że można zrobić coś takiego

Collection<Base> getCollection() 
{ 
    return Arrays.asList<Base>(new Derived(), 
           new Derived()); 
} 

Kiedy próbuję to skompilować (Java 6), kompilator narzeka, że ​​spodziewa się ")" przy przecinku.

+3

Tablice. asList –

Odpowiedz

47

Twoja składnia jest prawie poprawna; <Base> idzie przed nazwą metody:

return Arrays.<Base>asList(new Derived(), 
          new Derived()); 

Java 8

Dla Java 8, z jego improved target type inference, wyraźne typ argumentu nie jest konieczne. Ponieważ typem powrotu metody jest Collection<Base>, parametr type zostanie wywnioskowany jako Base.

return Arrays.asList(new Derived(), 
        new Derived()); 

Parametr typu jawnego jest nadal potrzebny w Java 7 i poniżej. Wciąż możesz podać parametr typu jawnego w Javie 8; to opcjonalne.

+0

Wow, nigdy nie słyszałem o tym –

+0

Istnieją przypadki w Java 8, gdzie trzeba podać parametr. Wpadłem na to, robiąc rzeczy takie jak 'MyClass. builder(). SomeMethodWithGenericSignature (pochodna) 'lub coś podobnego. –

Powiązane problemy