acabo de aprender acerca de este fine looking syntax¿Cómo obtener la clase de tipo genérico cuando no hay ningún parámetro de la misma?
Collections.<String>emptyList()
para obtener una List
vacío con elementos que son supuestamente de tipo String
. fuente de Java es el siguiente:
public static final List EMPTY_LIST = new EmptyList<Object>();
:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Ahora bien, si el código A método de ese modo en el que el tipo genérico no aparece en la lista de parámetros, ¿hay alguna manera de cómo puedo acceder a la clase real que se convierte en T
?
que digo, hasta ahora mi enfoque para codificar el mismo que habría sido
private <T> T get(String key, Class<T> clazz) {
// here I can do whatever I want with clazz, e.g.:
return clazz.cast(value);
}
Si me quita el clazz
-parámetro yo no sería capaz de hacer lo cast()
. Obviamente, podría hacer
return (T) value;
pero eso me da la advertencia habitual Type safety: Unchecked cast from Object to T
. Ok, @SuppressWarnings("unchecked")
ayuda aquí, pero en realidad quiero hacer algo con el tipo de devolución previsto del método. Si añado una variable local
T retValue;
Tendría que inicializar con algo, null
no ayuda. Después de asignarlo como
@SuppressWarnings("unchecked")
T retValue = (T) value;
Podría hacerlo, p.
retValue.getClass().getName()
pero si el elenco no termino con ninguna información sobre T
nuevo.
Dado que Java (o al menos mi Java 6) ya no tiene la información genérica durante el tiempo de ejecución, actualmente no se me ocurre una manera de hacerlo. ¿Hay alguna manera? ¿O tengo que seguir con mi "viejo" enfoque aquí?
Tenga en cuenta que el ejemplo que alineé es muy simple y no tiene mucho sentido. Quiero hacer cosas más complicadas aquí, pero eso está fuera del alcance.
parece un duplicado de [esta pregunta] (http://stackoverflow.com/questions/2434041/instantiating-generics-type-in-java) –
@NitzanVolman: Hasta cierto punto, usted tiene razón, pero no es completamente. – sjngm