2009-09-25 12 views
8

Przepraszam, jeśli tytuł wydaje się zagmatwany, ale niektóre przykłady są w porządku.Dlaczego typ ogólny z typem ogólnym nie może być przypisany do typu ogólnego Typ symbolu wieloznacznego

Powiedzmy mam pewne klasy Java z parametrem typu rodzajowego:

public class GenericClass<T> { 
} 

mogę utworzyć zmienną wpisany do przechowywania obiektu, za pomocą parametru rodzajowego ustawiony, powiedzieć String. Java będzie również dać mi przypisać tę zmienną na inną zmienną, ale z parametrem generycznego ustawionym typem wieloznaczny <?>:

GenericClass<String> stringy = ... 
GenericClass<?> generic = stringy; // OK 

jednak, gdy pracuje z klasą z parametru rodzajowego, jeśli ustawić typ tego parametru za rodzajową, nie można następnie przypisać obiekt tej klasy do identycznie wpisany/rodzaju genericized gdzie ten ostatni (wewnętrzna/zagnieżdżone) parametr jest typu wildcard <?>:

GenericClass<GenericClass<String>> stringy = ... 
GenericClass<GenericClass<?>> generic = stringy; // Compile Error 

// And just in case that is confusing, a more 
// realistic example involving Collections: 
List<GenericClass<String>> stringy = ... 
List<GenericClass<?>> generic = stringy; // Compile Error 

specyficzna jest błąd kompilacji :

Type mismatch: cannot convert from List<GenericClass<String>> to List<GenericClass<?>> 

Intuicyjnie sądzę, że przedmiotowe zadanie nie powinno stanowić problemu. Dlaczego to zadanie jest problemem?

+0

Duplikat strony http://stackoverflow.com/questions/1341093/nested-generics-with-wildcards – Dirk

Odpowiedz

8

Problem Twój licowa jest denominowany Covariance.

List<GenericClass<String>> stringy = ... 
List<GenericClass<?>> generic = stringy; 
generic.add(new GenericClass<Integer>()); 

Jeśli nie był to błąd kompilacji, to byłby możliwy ostatni wiersz kodu.

Można obejść problem w ten sposób:

List<? extends GenericClass<?>> generic = stringy; 

ale nie można używać add również dlatego, że nie wiem, co jest ? extends GenericClass<?> (kowariancji po raz kolejny). W tym przypadku możesz tylko wyliczyć listę i oczekiwać GenericClass<?>.

4

Technicznie, to dlatego, że List<GenericClass<String>> nie jest podtypem List<GenericClass<?>>. Aby to zadziałało, można zrobić coś takiego, jak która powinna działać zgodnie z oczekiwaniami (choć jest dość brzydka ...).

Patrz, na przykład, this SO question więcej szczegółów

Powiązane problemy