es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  ,

Answer

  1. Avatar for 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 realidad List<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:

    import com.google.common.reflect.TypeToken;
    
    ...
    
    Dummy dummy = new Dummy();
    
    // Para el método foo
    TypeToken<><integer>> fooTypeToken = new TypeToken<><integer>>() {};
    if (fooTypeToken.isAssignableFrom(dummy.getClass().getMethod("foo").getReturnType())) {
        System.out.println("foo devuelve List<integer>");
    }
    
    // Para el método bar
    TypeToken<><integer>> listTypeToken = new TypeToken<><integer>>() {};
    TypeToken<?> barTypeToken = TypeToken.of(dummy.getClass().getMethod("bar").getReturnType());
    if (listTypeToken.isAssignableFrom(barTypeToken)) {
        System.out.println("bar devuelve List<integer>");
    } else {
        System.out.println("bar no devuelve List<integer>");
    }
    

    En este ejemplo, creamos un TypeToken con el tipo genérico deseado (List<integer>) y usamos su método isAssignableFrom 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 un TypeToken<><integer>> y verificamos si es compatible con el tipo devuelto por el método.

    Para bar, creamos un TypeToken<><integer>> y un TypeToken para el tipo de retorno del método utilizando TypeToken.of(), para luego verificar si el tipo List<integer> es compatible con el tipo devuelto por el método.

    Tenga en cuenta que si Abc<t> no implementa List<t>, esta verificación fallará incluso si Abc<integer> es compatible con List<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.

Comments are closed.