Soit les classes suivantes:
1 2 3 4 5 6 7 8 9 10 11
|
public class Base<T> {
T id;
public T getId() {
return id;
}
public void setId(T id) {
this.id = id;
}
} |
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Generique<U,T extends Base<U>> {
Base<U> laBase;
public void setLaBase(Base<U> laBase) {
this.laBase = laBase;
}
public U getBaseId(){
return laBase.getId();
}
} |
et deux classes: Machin extends Base<MonObjet> et MachinTruc extends Generique<MonObject,Machin>U et T sont redondant, toute l'information sur U est déjà présente dans T. Je voudrais donc pouvoir faire
public class MachinTruc extends Generique<Machin>
mais je n'arrive pas à trouver comment déclarer Generique pour demander au compilateur d'extraire U à partir de T :/ Je ne sais même pas si c'est possible...
Pour la petite histoire, j'ai déjà en réalité une classe
Generique<T extends BaseString> mais je me retrouve sur un cas où il faudrait typer avec un BaseInteger, donc je voudrait refactorer la déclaration vers Base<> pour accepter plus large, mais si possible en n'ajoutant pas un paramètre générique car cela rendrait l'aval incompilable sans modif. Et des sous classes de Generique, on en a des dixaines dans différents projets . L'alternative c'est d'introduire une super classe qui reprends tout le code actuel:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class SuperGenerique<U,T extends Base<U>> {
Base<U> laBase;
public void setLaBase(Base<U> laBase) {
this.laBase = laBase;
}
public U getBaseId(){
return laBase.getId();
}
} |
et changer generique en
public class Generique<T extends BaseString> extends SuperGenerique<String,T>
Mais je voudrait éviter de créer cette classe en carton qui ne sert qu'à éviter le refactoring en aval
Partager