es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuál es la diferencia entre y ?

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?

Tags:  ,

Answer

  1. Avatar for 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 de Base, pero el tipo de elemento es desconocido. Por lo tanto, cuando intentamos poner un objeto del tipo T 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:

    private static final HashMap<integer, base=""> hashMap = new HashMap<>();
    

    Esto asegura que el HashMap solo pueda contener objetos del tipo Base. Con esta declaración, el método put ahora puede aceptar cualquier objeto del tipo T extends Base, ya que se garantiza que es un subtipo de Base. El código revisado se vería así:

    abstract public class Base {
        private static final HashMap<integer, 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 (T) hashMap.get(key);
        }
    }
    

    El método get también necesita una operación de conversión al tipo de T porque el método get devuelve un objeto del tipo Base, que debe ser convertido al tipo T extends Base antes de devolverlo.</integer,></integer,>

Comments are closed.