Il n'est pas clair si vous souhaitez effectuer la vérification à la compilation ou à l'exécution. Si vous voulez simplement vous assurer que le paramètre list transmis à la méthode contient certains types d'objets, redéfinissez T
de manière appropriée.
Par exemple, pour faire en sorte que le compilateur permettra seulement List<Comparable>
à passer à cette méthode, redéfinissez T
comme:
public <T extends Comparable<? super T>> List<T> doSth(List<T> l) {
// Method body omitted
}
Vous pouvez alors utiliser la méthode-surcharge (au lieu d'une instruction if-else), pour s'assurer que le code correct est appelé pour toute valeur de T
. Autrement dit, remplacer:
public <T> List<T> doSth(List<T> l) {
if(T extends Comparable) {
// do one thing
} else {
// do another
}
return null
}
avec ces:
public <T extends Comparable<? super T>> List<T> doSth(List<T> l) {
// do one thing
return null;
}
public <T> List<T> doSth(List<T> l, Class<T> clazz) {
// do another
return null;
}
Cependant, vous devez vous rappeler choisir la méthode surchargée pour appeler et vérification de type générique est la compilation que! Par exemple, le code suivant:
List<? extends Serializable> alist = new ArrayList<Integer>();
doSth(alist);
se fait appeler la deuxième méthode doSth
, car le paramètre de type de compilation (? extends Serializable
) ne met pas en œuvre Comparable
, même si le paramètre de type d'exécution (Integer
) fait.
Ergh. Pourquoi apporter 'Class' dans ce ?? –
@Tom: Parce qu'il répond à la question? Je sais avoir à fournir la classe est icky, mais il fait le travail ... –