2012-08-11 9 views
8

Class<? extends Integer> będzie kompilowany dobrze, ale Integer jest ostatecznym typem, więc nie ma sensu używać go jako górnej granicy (nic nie będzie kiedykolwiek extend).Symbol wieloznaczny z górną granicą ostateczną

Jeśli spróbujesz użyć ostatecznej typ jako górną granicę dla parametru typu, otrzymasz ostrzeżenie kompilatora:

Parametr typu T nie powinna być ograniczona przez końcowego typu Integer. rodzaje końcowe nie mogą być dodatkowo rozszerzony

Dlaczego przy użyciu ostatecznej typ jako górną granicę dla wieloznaczny być idealnie czysty, ale rzucać ostrzeżenie dla parametru typu? Dlaczego Java pozwala nawet na ograniczanie symboli wieloznacznych końcowym górnym typem?

Odpowiedz

5

nie jest dozwolonym przydziałem jako Class<? extends Integer>.

Na przykład ten kompiluje:

Class<? extends Number> numberClass = Integer.class; 
Class<? extends Integer> integerClass = numberClass.asSubclass(Integer.class); 

To nie:

Class<? extends Number> numberClass = Integer.class; 
Class<Integer> integerClass = numberClass.asSubclass(Integer.class); 

Ja nie mogłem dostać ostrzeżenie kompilatora, jak to zrobić (chyba można podać przykład i szczegóły dotyczące twojego kompilatora?).

+1

Wydaje mi się, że kompilator mógł sam dojść do tego, że 'Klasa 'zwrócony z twojego drugiego przykładu jest zgodny z' Class ', ponieważ' Integer' jest ostateczny. Ale przypuszczam, że kompilator byłby bardziej skomplikowany niż jego wartość. Może ostrzeżenie jest specyficzne dla Eclipse: Eclipse Juno w/JDT 3.8.0. – Jeffrey

Powiązane problemy