que tienen una clase Foo<T, U>
con el siguiente constructor:Obtención de argumentos de tipo de clase parametrizada
public Foo() {
clazz = Class<U>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
}
Lo que hago en el constructor está consiguiendo la clase del argumento U
. Lo necesito porque lo uso para crear una instancia de esa clase.
El problema es que no funciona cuando tengo una subclase de Foo
que no es una subcategoría directa de la misma. Déjame ponerlo con un ejemplo.
Tengo la clase Bar<T> extends Foo<T, Class1>
. Aquí, Class1
no es una variable sino una clase.
También tengo la clase Baz extends Bar<Class2>
. Class2
es una clase también, no una variable.
El problema es que falla al intentar crear una instancia de Baz
(Baz -> Bar<Class2> -> Foo<T, Class2>
). Obtengo ArrayIndexOutOfBoundsException
porque getActualTypeArguments()
devuelve una matriz que contiene solo la clase Class2
(tamaño 1) y estoy tratando de obtener el segundo elemento de la matriz. Eso es porque obtengo los argumentos de Bar<Class2>
, en lugar de los de Foo.
Lo que quiero es modificar el constructor de Foo de alguna manera que pueda obtener la clase en el parámetro U, no importa si la instancia de clase I es una subclase directa o no. Creo que debería poder subir a la jerarquía de clases hasta llegar a la clase Foo, convertirla en ParameterizedType y obtener los argumentos, pero no pude encontrar cómo.
¿Alguna idea?
Gracias de antemano.
Gracias por la respuesta :). Funciona para mi Una cosa que me di cuenta es que no se tuvo en cuenta el caso cuando se cambia el orden de los parámetros, por ejemplo, 'Bar se extiende Foo'. Cuando coloque la clase de argumento en la primera posición vacía en la matriz, en este ejemplo, obtendrá los tipos incorrectos. ¿No lo harás? –
drumkey