Estoy aprendiendo genéricos de Java a partir de un libro. El libro dice que "Variables de clase de tipo no son válidos en el contexto estático" y lo explica con el siguiente ejemplo.
Considere una clase genérica con variables de tipo, como la entrada. No se pueden utilizar las variables de tipo K y V con variables o métodos estáticos. Por ejemplo, el siguiente no funciona:
public class Entry<K, V> {
// Compiler error - V in static context ("Entry.this' cannot be referenced from a static context")
private static V defaultValue;
// Compiler error - V in static context ("Entry.this' cannot be referenced from a static context")
public static void setDefault(V value) {
defaultValue = value;
}
}
Después de todo, los medios de borrado de tipo sólo hay una variable de este tipo o método en la clase de Entrada borrado, y no uno para cada K y V.
No entiendo la explicación anterior. Intenté crear el mismo código para K también y tengo los mismos errores de compilación. ¿Por qué es ilegal el código anterior?
Los diseñadores de genéricos de Java eligieron para ponerlo en práctica utilizando un mecanismo llamado "tipo de borrado". Esto significa que las especialidades genéricas como Entry<String,Integer>
y Entry<Integer,String>
no existen como clases separadas. Los parámetros de tipo se borran.
Una vez que borra los parámetros de tipo de Entry<String,Integer>
y Entry<Integer,String>
uno se queda con sólo la Entry
clase.
Si fuera posible tener una variable estática, como defaultValue
era de esperar Entry<String,Integer>.defaultValue
a ser un número entero. Y que se puede esperar Entry<Integer,String>.defaultValue
a ser una cadena. Pero después del tipo de borrado de una sola Entry
clase con una sola defaultValue
variable, que ahora tiene que ser a la vez de enteros y de cadena. Eso es imposible. Es por eso que no se puede tener una variable estática del tipo genérico.