jueves
jul112013
Java Puzzle: Collections, ofrecen mucha flexibilidad
Dado el siguiente código, cuál crees que será el resultado y por qué?
import java.util.*; import static java.util.Collections.sort; class SimulatorExamBQ62Mangle { public static void main(String[] args) { List x = new ArrayList(); x.add(5); x.add(new Integer(42)); x.add(new Integer("17")); x.add(new Integer(812).longValue()); sort(x); System.out.println(x); } }
a. [17, 42, 5, 812]
b. [5, 17, 42, 812]
c. [5, 42, 17, 812]
d. Error en compilación
e. Una exception es lanzada en tiempo de ejecución
Reader Comments (5)
Si se usasen genéricos, no se podrían comparar "peras" (Integer) con "manzanas" (Long), como sucede cuando el comparador intenta comparar las posiciones 0 a 2 de la lista (Integer), con la 3 (Long), sin un error de compilación.
En este caso, hay que esperar a la ejecución, para ver que se lanza una excepción de typecast.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Integer> x = new ArrayList<>();
x.add(5);
x.add(Integer.valueOf(42));
x.add(Integer.valueOf("17"));
x.add(Integer.valueOf(812).longValue()); // ¡Error de compilación!
Collections.sort(x);
System.out.println(x);
}
}
Según lo leí, creí que daría un error de compilación en la línea 10 al considerar el objeto List como un List de Object y Object no implementa Comparable :)
Luego escribí el código y encontré la respuesta. Si no tipas las listas, se quedan sin tipar y el compilador no puede hacer sus validaciones, pero a la hora de ejecutarse salen los petes en al usar el método compareTo.
Gracias @sabate
Mi primera impresión a simple vista fue:
b. [5, 17, 42, 812]
Luego decidí compilar el código y ver qué sucedía. Finalmente el resultado que obtuve fue:
e. Una exception es lanzada en tiempo de ejecución
Para poder compilar con java6 tuve que agregar @SuppressWarnings({"uncheked", "rawtypes"}) al método main()
La lista se arma correctamente con los valores. Al momento de invocar a sort() el algoritmo interno de dicho método invoca a 42.compareTo(812L), y resulta que la firma de compareTo() de la clase Integer es:
public int compareTo(Integer anotherInteger)
Y la JVM al intentar hacer que
812L
se castee aInteger
lanza una:Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Integer.java:37)
at java.util.Arrays.mergeSort(Arrays.java:1144)
at java.util.Arrays.sort(Arrays.java:1079)
at java.util.Collections.sort(Collections.java:115)
at Colecciones.main(Colecciones.java:17)
Pensaba en error de compiliacion al verlo, cuando lo pruebas ves que va todo bien hasta que sellama al sort, como dice con anterioridad, al llamar al compareTo con peras y manzanas peta....
Salu2 compañeros!
Victor
hhtp://www.trapiello.net
Produce una excepción en tiempo de ejecución debido a que los objetos dentro de la lista no son comparables entre sí, dicho error ocurre en la línea 10