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.

Crear una matriz de genéricos en tiempo de ejecución en Java utilizando Super Type Tokens.

Necesito crear un array de genéricos en tiempo de ejecución y, debido a la eliminación de tipos de Java, estoy utilizando tokens de super tipo para lograrlo.
Creé la siguiente clase abstracta:

public abstract class TypeReference<T> {

    private final Type type;

    public TypeReference() {
        Type superclass = getClass().getGenericSuperclass();
        type = ((ParameterizedType) superclass).getActualTypeArguments()[0];
    }

    public Type getType() {
        return type;
    }

}

Y estoy intentando generar mi array con el siguiente código:

public static void main(String[] args) {
    TypeReference<LinkedListNode<Integer>> token = new TypeReference<>() {};
    LinkedListNode<Integer>[] array = generateRandomArray(10, token);
}

public static <T> T[] generateRandomArray(int size, TypeReference<T> c) {
    return (T[]) Array.newInstance(c.getType().getClass(), size);
}

Esta solución no funciona porque c.getType().getClass() está devolviendo ParameterizedType. Debería pasar c.getType() (que es LinkedListNode<Integer>), pero esta última solución no se compila ya que Type no se puede convertir a Class<?>.
¿Sabes cómo puedo aprovechar el token de super tipo para generar el array?
Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Java, arrays y genéricos, puedo recomendar la siguiente solución:

    Para aprovechar el token de super tipo y generar el array, puede modificar el método generateRandomArray de la siguiente manera:

    public static <t> T[] generateRandomArray(int size, TypeReference<t> c) {
        Class<?> typeClass = (Class<?>) c.getType();
        return (T[]) Array.newInstance(typeClass, size);
    }
    

    Aquí, primero convertimos el objeto Type a Class<?> y luego lo usamos para crear una nueva instancia del array. Esta solución debería funcionar para su caso de uso.

    Nota: Es importante asegurarse de que la referencia de tipo se proporcione correctamente al llamar al método generateRandomArray. Por ejemplo, si desea crear un array de LinkedListNode<integer>, debe pasar new TypeReference<><integer>>() {} como referencia de tipo.

Comments are closed.