tipos incompatibles: la variable de inferencia T tiene límites incompatibles [duplicate]

2 minutos de lectura

tengo el siguiente fragmento de código

public int solution(int X, int[] A) {

    List<Integer> list = Arrays.asList(A);

Por alguna razón, arroja el siguiente error de compilación

Solution.java:11: error: tipos incompatibles: la variable de inferencia T tiene límites incompatibles List list = Arrays.asList(A); ^ restricciones de igualdad: límites inferiores enteros: int[] donde T es una variable de tipo: T extiende el objeto declarado en el método asList(T…)

Supongo que se trata de una característica de Java 8, pero no estoy seguro de cómo resolver el error

  • Utilizar Integer[] en lugar de int[].

    – sp00m

    17 de diciembre de 2014 a las 9:56

Arrays.asList está esperando un número variable de Object. int no es un Objectpero int[] es así Arrays.asList(A) creará un List<int[]> con un solo elemento.

Puedes usar IntStream.of(A).boxed().collect(Collectors.toList());

  • Tenga en cuenta que el enfoque de IntStream tiene una semántica ligeramente diferente que el uso de asList; los cambios en la matriz subyacente no se reflejan en la lista resultante. (así que hay una copia de algún tipo en marcha). asList(T…) no copia. Desgraciadamente no conozco ninguna forma de evitarlo.

    – rcreswick

    12 mayo 2016 a las 14:55

  • @rcreswick Interesante, no lo sabía. Sin embargo, si este comportamiento es el esperado, entonces probablemente no haya manera de lograrlo con un int[]como el int[] no podría ser la matriz de respaldo de la resultante List<Integer>.

    – tobias_k

    12 mayo 2016 a las 14:59

  • He estado tratando de encontrar una manera de lograr esto, y creo que la única forma es crear un nuevo tipo de lista que administre los accesos para reutilizar una matriz de respaldo, lo que probablemente obviaría las mejoras generales de rendimiento que espera al usar un matriz de respaldo.

    – rcreswick

    14 de mayo de 2016 a las 3:33

En Java 8 puedes hacer

List<Integer> list = IntStream.of(a).boxed().collect(Collectors.toList());

No hay atajos para convertir desde int[] to List as Arrays.asList no se ocupa del boxeo y solo creará una Lista que no es lo que desea. Tienes que hacer un método de utilidad.

int[] ints = {1, 2, 3};
List<Integer> intList = new ArrayList<Integer>();
for (int index = 0; index < ints.length; index++)
{
    intList.add(ints[index]);
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad