Soit les classes suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
  }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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