Java Generics Wildcarding Con Múltiples Clases


Quiero tener un objeto de Clase, pero quiero forzar cualquier clase que represente para extender la clase A e implementar la interfaz B.

Puedo hacer:

Class<? extends ClassA>

O:

Class<? extends InterfaceB>

Pero no puedo hacer ambas cosas. ¿Hay alguna manera de hacer esto?

Author: Jeff Axelrod, 2009-04-14

2 answers

En realidad, tú puedes hacer lo que quieras. Si desea proporcionar múltiples interfaces o una clase más interfaces, debe tener su comodín algo como esto:

<T extends ClassA & InterfaceB>

Ver el Tutorial de Genéricos en sun.com, específicamente la sección Parámetros de tipo acotados , 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 necesite.

Esto puede complicarse arbitrariamente. A demostrar, ver la declaración de 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 dice 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 quieras, es posible que tengas que saltar a través de algunos aros. Pero puedes hacerlo. Puedes 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;
}

Para obtener variable que tiene la restricción que desee. Para obtener más información y ejemplos, consulte la página 3 de Genéricos en Java 5.0. Nota, en <T extends B & C>, el nombre de la clase debe ir primero, y las interfaces le siguen. Y, por supuesto, solo puede enumerar una sola clase.

 525
Author: Eddie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-23 15:18:54

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 type a nivel de método o clase.

import java.util.List;
interface A{}
interface B{}
public class Test<E extends B & A, T extends List<E>> {
    T t;
}
 14
Author: user2861738,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-21 18:04:20