¿Cuál es la diferencia entre y extiende Foo>?
Tengo el siguiente código:
public abstract class Base {
private static final HashMap<Integer, ? extends Base> hashMap = new HashMap<>();
public static <T extends Base> void put(Integer key, T val) {
hashMap.put(key, val);
}
public static <T extends Base> T get(Integer key) {
return hashMap.get(key);
}
}
Así que, obtengo tipos incompatibles en el método Base.put()
: <T extends Base>
y <? extends Base>
.
¿Cuál es la diferencia y cómo reescribir ese código correctamente?
davy.ai
El problema con el código actual es que la declaración del HashMap usa un tipo comodín
? extends Base
, lo que significa que el HashMap puede contener cualquier objeto que extienda deBase
, pero el tipo de elemento es desconocido. Por lo tanto, cuando intentamos poner un objeto del tipoT extends Base
en el HashMap, el compilador lo considera como un tipo inválido porque el tipo de elemento es desconocido en ese punto.Para solucionar este problema, podemos declarar el HashMap con un parámetro de tipo de la siguiente manera:
Esto asegura que el HashMap solo pueda contener objetos del tipo
Base
. Con esta declaración, el métodoput
ahora puede aceptar cualquier objeto del tipoT extends Base
, ya que se garantiza que es un subtipo deBase
. El código revisado se vería así:El método
get
también necesita una operación de conversión al tipo deT
porque el métodoget
devuelve un objeto del tipoBase
, que debe ser convertido al tipoT extends Base
antes de devolverlo.</integer,></integer,>