2012-11-15 11 views
6

otrzymuję „Niezgodność typów: nie można przekonwertować z List<CherryCoke> do List<Coke<?>>Czy "lista koksów wiśniowych" jest "listą koksów"?

Wygląda jak „listy koksu wiśni” nie jest „lista koksu”. Jest to sprzeczne z intuicją. Jak mogę utworzyć "xs" tak czy inaczej, jeśli musi to być List<Coke<?>> i muszę mieć podklasę ?

class Taste { } 
class Cherry extends Taste { } 

abstract class Coke<T extends Taste> { }  

class CherryCoke extends Coke<Cherry> { } 

class x { 
    void drink() { 
    List<Coke<?>> xs = Arrays.asList(new CherryCoke()); 
    } 
} 
+0

Najbardziej przydatny skrót do zapamiętania jest to, [PECS] (http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs). 'Coke ' nie jest niczym szczególnym, więc nie można powiedzieć "lista koksów to lista wiśniowych coli", ale można użyć '? rozszerza Coke '. Zobacz pytanie, które łączyłem, aby uzyskać więcej informacji. – Brian

Odpowiedz

9

Masz rację - a „lista koksu” nie jest „lista koksu wiśni” - listy „rzeczy, które rozciągają się koks” jest „lista koksu wiśni” chociaż.

Prawdopodobnie chcesz określić xs jak List <? extends Coke<?>> xs = Arrays.asList(new CherryCoke());

+1

To właściwie niepotrzebne. Zobacz moją odpowiedź. –

4
List<Coke<?>> xs = Arrays.asList(new CherryCoke()); 

List<CherryCoke> nie jest typu sub List<Coke<?>> (Lista Coke czegokolwiek).

należy zdefiniować górną granicę rodzaju ogólnego.

List<? extends Coke<?>> xs = Arrays.asList(new CherryCoke()); 
+0

Co to jest * upper * -bound? Zmienilbym to słowo na "constraint" ... to jest oficjalna nazwa, IIRC, i to nawet z natury znaczące, IMHO ... "związany" brzmi jak tablica pod maską, której nie ma. – corlettk

+1

@corlettk sprawdź tutaj http://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html – PermGenError

+4

Proszę podać sos. Muszę jeść moje słowa, a one są kwaśne! ;-) – corlettk

5

Jak inni zwrócili uwagę, List<CherryCoke> i List<Coke<?>> nie to samo.

Ale to nie jest naprawdę problem tutaj. Nie trzeba wpisywać xs jako List<? extends Coke<?>>. Równie dobrze można było stworzyć nowy List<Coke<?>>, a następnie dodać do niego nowy CherryCoke.

Błąd polega po prostu na niepoprawnym wprowadzeniu parametru typu T przez kompilator asList. Jeśli podasz T się kompiluje:

List<Coke<?>> xs = Arrays.<Coke<?>>asList(new CherryCoke()); 
+0

To również działa. Które rozwiązanie chcesz użyć może zależeć od podstawowego programu, którego częścią jest ten kod. – Krease

Powiązane problemy