¿Hay alguna forma de saber si el tipo de retorno de un método es un List?
Digamos que tengo una clase,
public class Dummy {
public List<Integer> foo() {...}
public Abc<Integer> bar() {...}
}
Para el método foo
, puedo verificar el tipo de retorno usando ParameterizedType
, pero para el método bar
, ¿hay alguna forma de saber si Ab<Integer>
es realmente un List<Integer>
?
Editar para agregar algunos antecedentes:
Tenemos docenas de clases POJO de terceros y necesitamos extraer la información de campo de estas clases y crear un esquema basado en ella.
Para los campos primitivos regulares, es directo, pero en esas clases, también tienen campos con tipos como List<Integer>
, o ArrayList<Integer>
, o Abc<Integer>
(Abc<T>
puede o no implementar List<T>
).
Entonces, necesitamos una forma de determinar si es un campo repetido o no, si es uno repetido, ¿cuál es el argumento de tipo, es un Integer o algo más?
davy.ai
Como experto en IT especializado en Java y reflexión, aquí hay algunas ideas sobre cómo verificar si un tipo genérico es un tipo específico, como verificar si
Abc<integer>
es en realidadList<integer>
:Puede usar la clase
TypeToken
de la biblioteca Google Guava para obtener el tipo en tiempo de ejecución de un tipo genérico. Aquí hay un ejemplo:En este ejemplo, creamos un
TypeToken
con el tipo genérico deseado (List<integer>
) y usamos su métodoisAssignableFrom
para verificar si el tipo en tiempo de ejecución del valor devuelto por el método es compatible con el tipo deseado.Para
foo
, simplemente creamos unTypeToken<><integer>>
y verificamos si es compatible con el tipo devuelto por el método.Para
bar
, creamos unTypeToken<><integer>>
y unTypeToken
para el tipo de retorno del método utilizandoTypeToken.of()
, para luego verificar si el tipoList<integer>
es compatible con el tipo devuelto por el método.Tenga en cuenta que si
Abc<t>
no implementaList<t>
, esta verificación fallará incluso siAbc<integer>
es compatible conList<integer>
. Si necesita verificar relaciones más complejas entre tipos, puede ser necesario usar técnicas de reflexión más avanzadas o bibliotecas externas como Apache Commons Lang.