Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Dimitar Stefanov en 11 de Marzo 2016, 12:35
-
Buenas tardes.
Aquí dejo la solución del ejercicio CU00679B del curso Java desde cero.
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:
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.
-
Por qué este código sí funciona:
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:
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:
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>
-
Hola!
Para demostrar que el código cumple con el ejercicio no está de más incluir algún mensaje para comprobarlo:
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):
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!
-
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 :)