class HasId<I> {}
class HasStringId extends HasId<String> {}
class Alert<T extends /*Some*/Object> extends HasStringId {}
class BaseController<M extends HasId<String>> {
// abstract Class<M> getModelClass();
}
class AlertController extends BaseController<Alert> { // error here
// @Override Class<Alert> getModelClass() {
// return Alert.class;
// }
}
compila bene su openjdk6, ma in OpenJDK7 dà:Perché questi farmaci generici non si compilano in OpenJDK7, ma fare in openjdk6
AlertController.java:50: error: type argument Alert is not within bounds of
type-variable T
class AlertController extends BaseController<Alert> {
^
where T is a type-variable:
T extends HasId<String> declared in class BaseController
Nota che non c'è rawtype avvertimento linea 50, a causa di allarme deve essere parametrizzato. Se lo faccio, ad es. extends BaseController<Alert<Object>>
, codice compila. Ma non posso farlo, perché ho bisogno di implementare getModelClass().
AGGIORNAMENTO: si trattava di un bug nelle implementazioni di Java 6, risolto in Java 7: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6559182. (Ed ecco la mia domanda agli sviluppatori di compilatori: http://openjdk.5641.n7.nabble.com/Nested-generics-don-t-compile-in-1-7-0-15-but-do-in-1-6-0-27-td121820.html)
Cosa succede se si parametrizza come 'extends BaseController>'? (Inoltre, il messaggio di errore si lamenta di "Controller extends ...", ma il codice postato è "AlertController extends ...". Sei sicuro di avere la linea corretta?) –
Perché c'è un downvote? –
@TedHopp Se si parametrizza con 'Alert >', non è possibile implementare 'getModelClass()'. Non è stato possibile, fino a quando Paul Bellora ha suggerito un bel trucco per lanciare la Classe in Classe >. @PaulBellora non sono io. Grazie per il trucco! –