En fait, vous pouvez faire ce que vous voulez. Si vous souhaitez fournir plusieurs interfaces ou une classe plus d'interfaces, vous devez faire en sorte que votre caractère générique ressemble à ceci:
<T extends ClassA & InterfaceB>
Consultez le didacticiel sur les génériques sur sun.com, en particulier la section Paramètres de type délimités , au bas de la page. Vous pouvez en fait lister plus d'une interface si vous le souhaitez, en utilisant & InterfaceName
pour chacune dont vous avez besoin.
Cela peut devenir arbitrairement compliqué. Pour le démontrer, voir la déclaration JavaDoc de Collections#max
, qui (enroulée sur deux lignes) est:
public static <T extends Object & Comparable<? super T>> T
max(Collection<? extends T> coll)
pourquoi si compliqué? Comme indiqué dans la FAQ Java Generics: pour préserver la compatibilité binaire .
Il semble que cela ne fonctionne pas pour la déclaration de variable, mais cela fonctionne lorsque vous mettez une limite générique sur une classe. Ainsi, pour faire ce que vous voulez, vous devrez peut-être sauter à travers quelques cerceaux. Mais tu peux le faire. Vous pouvez faire quelque chose comme ça, en mettant une limite générique sur votre classe, puis:
class classB { }
interface interfaceC { }
public class MyClass<T extends classB & interfaceC> {
Class<T> variable;
}
pour obtenir variable
cela a la restriction que vous voulez. Pour plus d'informations et d'exemples, consultez la page 3 de Generics in Java 5.0 . Notez que dans <T extends B & C>
, le nom de la classe doit venir en premier et les interfaces suivent. Et bien sûr, vous ne pouvez lister qu'une seule classe.