Extender Clases Genéricas


public class MyGeneric<T, E> {}

public class Extend1<T, E> extends MyGeneric<T, E> {}

public class Extend2 extends MyGeneric<String, Object> {}

Por lo que sé, ambas subclases en el ejemplo anterior son válidas. Me preguntaba cómo Java sabe cuando los tipos dados en la superclase van a ser definidos cuando la subclase es instanciada, y cuando son nombres de clase reales (es decir, ¿Cómo sabe que T, E no son nombres de clase)?

A side note, is it permissible (even if uncommon) to use more than one letter for the generic types? ¿Qué pasa si (a través de algún error de planificación) Los tipos entran en conflicto con un clase existente, por ejemplo,

public class E{}
public class Foo<E>{}

¿Qué sucede entonces?

Editar: Gracias por responder tan rápidamente. Para responder a mi primera pregunta, La respuesta de Joaquín es la más efectiva.

Para responder al punto lateral, la respuesta de aioobe es más clara

Author: Community, 2011-08-31

3 answers

Veamos esta definición:{[18]]}

public class Extend1<T, E> extends MyGeneric<T, E> {}

Aquí T y E están presentes dos veces y en dos roles diferentes

  • en Extend1<T,E>usted define argumentos de tipo. Esto significa que el tipo Extend1 tiene dos argumentos de tipo (no acotados) T y E. Esto le dice al compilador Java que aquellos que usan Extend1 necesidad de especificar los tipos.
  • en extends MyGeneric<T,E> usted usa los argumentos de tipo previamente definidos. Si T y E no conocidos por ser argumentos de tipo aquí, entonces T y E serían referencias de tipo simples, es decir, el compilador buscaría clases (o interfaces,...) nombrado T y E (y lo más probable es que no los encuentre).

Sí, los argumentos de tipo siguen las mismas reglas sintácticas que cualquier otro identificador en Java, por lo que puede usar varias letras ABC o incluso nombres que pueden ser confusos (usar un argumento de tipo llamado String es legal, pero altamente confuso).

Tipo de letra simple los nombres de argumento son simplemente una estrategia de nomenclatura muy común.

 56
Author: Joachim Sauer,
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
2011-08-31 10:33:12

Me preguntaba cómo Java sabe cuando los tipos dados en la superclase van a ser definidos cuando la subclase es instansiated, y cuando son nombres de clase reales (es decir, ¿Cómo sabe que T, E no son nombres de clase)?

A Java no le importa. Si lo haces...

class MyGeneric<String> extends ArrayList<String> {
    String value;
}

¿es permisible (aunque poco común) usar más de una letra para los tipos genéricos? ¿Qué pasa si (a través de algún error de planificación) Los tipos entran en conflicto con una clase existente, p. ej.

Sí, puede usar cualquier identificador Java válido para los parámetros de tipo.

Los nombres pueden estar en conflicto, pero Java no tratará esto como un error. Identificadores entre <...> siempre se tratará como parámetros de tipo, independientemente de si el identificador corresponde a un nombre de clase.

Sin embargo, puede ser bastante confuso. He aquí un ejemplo:

class MyGeneric<String> extends java.util.ArrayList<String> {
    String value;
}

class Test {
    public static void main(String... args) throws Exception {
        MyGeneric<Integer> obj = new MyGeneric<Integer>();
        obj.value = 5;
        //          ^
        //          |
        //          '--- Assign an integer to what seems to be a String!
    }
}

Pregunta similar:

 22
Author: aioobe,
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
2017-05-23 12:32:11

No hay problema con:

public class E{}
public class Foo<E>{}

Porque en el contexto de Foo<E>, E es un tipo.

 2
Author: Bohemian,
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
2011-08-31 10:31:23