En realidad, usted puede hacer lo que quiera. Si desea proporcionar múltiples interfaces o una clase más interfaces, debe hacer que su comodín se vea así:
<T extends ClassA & InterfaceB>
Consulte el Tutorial de genéricos en sun.com, específicamente la sección Parámetros de tipo acotado , en la parte inferior de la página. En realidad, puede enumerar más de una interfaz si lo desea, utilizando & InterfaceName
para cada una que necesita.
Esto puede ser arbitrariamente complicado. Para demostrarlo, vea la declaración JavaDoc de Collections#max
, que (envuelto en dos líneas) es:
public static <T extends Object & Comparable<? super T>> T
max(Collection<? extends T> coll)
¿Por qué tan complicado? Como se dijo en las preguntas frecuentes de Java Generics: para preservar la compatibilidad binaria .
Parece que esto no funciona para la declaración de variables, pero funciona cuando se pone un límite genérico en una clase. Por lo tanto, para hacer lo que quiera, puede que tenga que saltar algunos aros. Pero puedes hacerlo. Puede hacer algo como esto, poniendo un límite genérico en su clase y luego:
class classB { }
interface interfaceC { }
public class MyClass<T extends classB & interfaceC> {
Class<T> variable;
}
conseguir variable
eso tiene la restricción que quieres. Para obtener más información y ejemplos, consulte la página 3 de Genéricos en Java 5.0 . Tenga en cuenta que, en <T extends B & C>
, el nombre de la clase debe venir primero, y las interfaces siguen. Y, por supuesto, solo puede enumerar una sola clase.
?
en esa expresión, entonces, ¿es realmente un "comodín"? Pregunto porque no puedo hacer que todo el concepto de "extender dos cosas a la vez" funcione cuando el parámetro de tipo realmente es un comodín.No puede hacerlo con parámetros de tipo "anónimos" (es decir, comodines que usan
?
), pero puede hacerlo con parámetros de tipo "con nombre". Simplemente declare el parámetro de tipo a nivel de método o clase.fuente