Buscar
Social
Ofertas laborales ES
« No tires tu viejo framework web Java: la pequeña historia Single Page Interface de Twitter | Main | Preinscripción abierta para Codemotion 2013 »
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

PrintView Printer Friendly Version

EmailEmail Article to Friend

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);
}
}

julio 12, 2013 | Registered Commenterchoces

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

julio 12, 2013 | Registered Commenterrobertiano

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 a Integer 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)

julio 12, 2013 | Registered CommenterGermanG

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

julio 16, 2013 | Unregistered CommenterGianluigi

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>