Como podemos hacer

ArrayList<?> l = new ArrayList<Integer>();

¿Podemos decir que ArrayList<?> es la superclase de ArrayList<Integer>? ¿El ejemplo anterior, por lo tanto, representa el polimorfismo?

Actualización : en general, si A<T> es la superclase de B<T>, entonces

A<?> obj = new B<Integer>();

Entonces, ¿es correcto decir que A<?> es una superclase de B<Integer>?

4
Number945 24 mar. 2017 a las 10:02

2 respuestas

La mejor respuesta

TLDR :

¿Podemos decir que ArrayList<?> es la superclase de ArrayList<Integer>?

NO pero podemos decir que es un supertipo de ArrayList<Integer>

Entonces, ¿es correcto decir que A<?> es una superclase de B<Integer>?

y también podemos decir que es un supertipo de B<Integer>

También tenga en cuenta que la herencia se usa solo en el contexto de subclase o superclase y no de subtipo o supertipo.

Referencia rápida


Lo primero que debe entender es la clase es un tipo en java. Veremos a continuación que donde sea válido para usar el término sub / super clase, es válido usar sub / super tipo pero no al revés

Permítanme ahora definir la superclase. De acuerdo con JLS 8.1.4

Dada una declaración de clase (posiblemente genérica) para C<F1,...,Fn> (n ≥ 0, C ≠ Objeto) (Fi aquí es parámetro de tipo), la superclase directa del tipo de clase C<F1,...,Fn> es el tipo dado en la cláusula extendida de la declaración de C si un la cláusula extiende está presente, u Objeto de lo contrario.

Sea C<F1,...,Fn> (n> 0) una declaración de clase genérica. El directo superclase del tipo de clase parametrizada C<T1,...,Tn>, donde Ti (1 ≤ i ≤ n) es un tipo (argumento), es D<U1 θ,...,Uk θ>, donde D<U1,...,Uk> es el superclase directa de C<F1,...,Fn>, y θ es la sustitución [F1: = T1, ..., Fn: = Tn].

Una clase A es una subclase de clase C si se cumple alguna de las siguientes condiciones:

a) A es la subclase directa de C
b) Existe una clase B tal que A es una subclase de B y B es una subclase de C, aplicando esta definición recursivamente.

Se dice que la clase C es una superclase de clase A cuando A es una subclase de C.

Para explicar la cosa en pequeñas palabras simples, considere un ejemplo más simple: C<F1,...,Fn> sea ArrayList<T> y C<T1,...,Tn> se dirá ArrayList<Integer> en la definición anterior. T es parámetro de tipo y lo instanciamos con Integer que es argumento de tipo.

[¿Qué queríamos decir con θ es la sustitución [F1: = T1, ..., Fn: = Tn]? ]

Ahora, ¿A<?> viene en la cláusula extendida de A<Integer>? (Sé que es estúpido pedir tal estructura, pero seamos estrictos con la definición). No, no lo hace. En general, en extensiones mencionamos un tipo de clase completamente diferente.

Ahora, veamos la definición de sub / super tipo. Por JLS 4.10.2

Dada una declaración de tipo genérico C<F1,...,Fn> (n> 0), el supertipos del tipo parametrizado C<T1,...,Tn>, donde Ti (1 ≤ i ≤ n) es un tipo, son todos los siguientes:

  1. D<U1 θ,...,Uk θ>, donde D<U1,...,Uk> es un tipo genérico que es un Supertipo directo del tipo genérico C<T1,...,Tn> y θ es el sustitución [F1: = T1, ..., Fn: = Tn].

  2. C<S1,...,Sn>, donde Si contiene Ti (1 ≤ i ≤ n) (§4.5.1).

  3. El tipo Objeto, si C<F1,...,Fn> es un tipo de interfaz genérico sin superinterfaces directas.

  4. El tipo sin procesar C.

Ahora por esta definición, según el punto 2

C<S1,...,Sn>, donde Si contiene Ti (1 ≤ i ≤ n) (§4.5.1).

? contiene Integer (Referencia) . Por lo tanto, esto hace que A<?> supertipo de A<Integer>.

Puede ver fácilmente el punto 1 de esta definición, incluye la definición de subclase en sí misma.

La segunda parte de la pregunta, donde hemos dicho que A<T> se extiende B<T>, hace que caiga bajo ambas definiciones.

Por último, vemos lo que significa la herencia. Por JLS 8.4.8

Una clase C hereda de su superclase directa todo concreto métodos m (tanto estáticos como de instancia) de la superclase para la cual todos de lo siguiente es cierto: [...]

2
Number945 22 jul. 2018 a las 05:43

Aquí la herencia se aplica a las clases genéricas, no a los argumentos genéricos.

Es decir, ArrayList<?> no es superclase de ArrayList<Integer>

Es la misma clase con diferentes parámetros de tipo. Si hubiera utilizado cualquier otro parámetro de tipo que no sea <?>, el código no habría funcionado. incluso con superclase de entero

0
harsha kumar Reddy 24 mar. 2017 a las 17:36