Convierta el código heredado de Java a genérico: ¿cómo reemplazar Object por tipo?

// código heredado

void setCacheValue(String name, Object value){
    getServletContext().setAttribute(name, value);
}
Object getCacheValue(String name){
    return getServletContext().getAttribute(name);
}

// así que quiero usar genérico para "seguridad de tipo"

// first, set method seems working perfectly
<T> void setCacheObject(String name, T value){
    getServletContext().setAttribute(name, value);
}

// entonces, aquí viene el problema

<T> T getCacheValue(String name){    
    // of course, I cannot change servlet class - it returns Object type
    Object value = getServletContext().getAttribute(name);
    // would this work:     
    return  (T) value;
    // this cast is meaningless... but how should I do it?
}

// Esto es lo que debo lograr en mi código de llamada limpio :

{
    double x = 1.2;
    setCacheValue("x", x);
    //...
    // later
    Double value = getCacheValue("x");
    // too bad cannot use primitive type - it cannot handle null

}

Entonces, ¿cuál es la forma correcta de hacer esto?

Respuesta 1

De hecho, eso no es posible. Deberá pasar el "concreto" de Talguna manera como argumento de método para que el tipo real se conozca durante el tiempo de ejecución. El enfoque de uso común es pasarlo como Class<T>, para que pueda hacer uso de Class#cast():

<T> T getCacheValue(String name, Class<T> type) {
    return type.cast(getServletContext().getAttribute(name));
}

Puede usarlo de la siguiente manera:

Double value = getCacheValue("x", Double.class);
Respuesta: 2

Los genéricos de mapas admiten un tipo en todos los valores del mapa, no un tipo diferente para valores específicos. Puedes ver cómo simularlo aquí . Básicamente, la idea es que debe tener el tipo de seguridad en la clave, donde la clave tiene un tipo genérico que existe simplemente para asociarlo con el valor.

Al final del día, no podrá hacerlo sin un yeso inseguro, pero puede hacerlo de una manera que sea extremadamente improbable que haya un problema con un yeso y de una manera que sea segura para el tipo usuarios de tu clase.

Respuesta: 3

Tengo un HashMap que quiero convertir en objeto personalizado Response. No estoy seguro de cómo establecer los valores (80, 190, 900, 95) de HashMap en el objeto personalizado. Cómo escribir una función separada en ...

Estoy tratando de obtener un IntStream de una matriz int n dimensional. ¿Hay una buena forma de API para hacerlo? Conozco el método de concatenación para dos flujos.

Si tiene un ENUM simple con solo valores. Getters están disponibles. ¿Se deben escribir pruebas unitarias para este ENUM? ¿Debería una prueba cubrir todos los nombres de tipo? ¿Algún consejo? // ENUM con constructor y ...

Estoy tratando de contar páginas de un documento de Word con Java. Este es mi código real, estoy usando las bibliotecas de Apache POI String path1 = "E: / iugkh"; Archivo f = archivo nuevo (ruta1); Archivo [] archivos = f.listFiles (); ...