Autor Tema: incompatible types: no instance of type variable T exist so that java CU00679B  (Leído 5323 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas tardes.

Aquí dejo la solución del ejercicio CU00679B del curso Java desde cero.

Citar
EJERCICIO

Declara un array que contenga seis booleanos que sean true, true, false, false, true, false. A continuación, crea una lista de tipo LinkedList a partir de dicho array usando la clase Arrays del api de Java.

El código:

Código: [Seleccionar]
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class TransformacionEnArrayList{
    public static void main(String []Args){
        Boolean [] miListaDeBooleans = {true,true,false,false,true,false};
        List<Boolean> miListaLinkedList = new LinkedList<Boolean>();
        miListaLinkedList = Arrays.asList(miListaDeBooleans);
    }
}

Gracias.
« Última modificación: 13 de Marzo 2016, 19:48 por César Krall »

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Re:CU00679B Transformar un array en ArrayList, Java
« Respuesta #1 en: 11 de Marzo 2016, 12:46 »
Por qué este código sí funciona:

Código: [Seleccionar]
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class TransformacionEnArrayList{
    public static void main(String []Args){
        Boolean [] miListaDeBooleans = {true,true,false,false,true,false};
        List<Boolean> miListaLinkedList = new LinkedList<Boolean>();
        miListaLinkedList = Arrays.asList(miListaDeBooleans);
    }
}

y este, en cambio, no:

Código: [Seleccionar]
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class TransformacionEnArrayList{
    public static void main(String []Args){
        Boolean [] miListaDeBooleans = {true,true,false,false,true,false};
        LinkedList<Boolean> miListaLinkedList = new LinkedList<Boolean>();
        miListaLinkedList = Arrays.asList(miListaDeBooleans);
    }
}

No se supone que la clase "LinkedList" implementa la intefaz "List". ¿Por qué tenemos que especificar que el objeto "miListaLinkedList" tiene que ser de la interfaz "List"? ¿No todos los objetos "LinkedList" implementan la interfaz "List"? Qué lío!, jejejeje

Gracias

PD: El error que da es:

Citar
incompatible types: no instance(s) of type variable(s) T exist so that java.util.List<T> conforms to java.util.LinkedList<java.lang.Boolean>

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola!

Para demostrar que el código cumple con el ejercicio no está de más incluir algún mensaje para comprobarlo:

Código: [Seleccionar]
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class TransformacionEnArrayList{
    public static void main(String []Args){
        Boolean [] miListaDeBooleans = {true,true,false,false,true,false};
        List<Boolean> miListaLinkedList = new LinkedList<Boolean>();
        miListaLinkedList = Arrays.asList(miListaDeBooleans);
        for (int i=0; i<miListaDeBooleans.length; i++) {
        System.out.println("El array original: "+miListaDeBooleans[i]);}
        System.out.println("La colección de objetos es "+miListaLinkedList);
    }
}

¿Por qué el segundo código no funciona? Porque el método asList de la clase Arrays del api java tiene esta signatura:

static <T> List<T>    asList(T... a)
Returns a fixed-size list backed by the specified array.

Te pide específicamente que sea List. Como tú dices, cabría esperar que el compilador reconociera que el objeto pasado al ser un LinkedList también es un List, pero hay veces que el compilador no llega tan lejos como nosotros suponemos que va a llegar.

Se puede usar esto (casting):

Código: [Seleccionar]
import java.util.LinkedList;
import java.util.Arrays;
import java.util.List;

public class TransformacionEnArrayList{
    public static void main(String []Args){
        Boolean [] miListaDeBooleans = {true,true,false,false,true,false};
        LinkedList<Boolean> miListaLinkedList = new LinkedList<Boolean>();
        miListaLinkedList = (LinkedList)Arrays.asList(miListaDeBooleans);
    }
}

Pero esto se considera una operación insegura (y salta un warning) por lo que es preferible declararlo como has planteado en la solución al ejercicio

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Hola, César.

Pues sí, tienes razón, no estaría de más demostrar el funcionamiento del código con un mensaje por pantalla, jeje. A veces voy más a lo práctico y doy por hecho que todo el mundo usa mi tipo de editor (BlueJ). Tomo nota de la observación :)

Entiendo tu ejemplo de "casting". Con él como que le "recuerdas" al compilador que lo que le vas a pasar es un objeto "LinkedList" y así recordarle que aunque espera un objeto clase "List" también pueden pasarle un objeto tipo "LinkedList".

Creo que lo he entendido.

Gracias.

PD: Puede ser que no utilizo muy bien los conceptos informáticos. Perdonadme :)

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".