Recientemente me encontré con un código que no se compilaría en mi Eclipse debido al problema del "mismo borrado" (se parecía mucho al this one). Los tipos que escribieron el código me aseguraron que compila en su entorno local y su integración continua, así que jugué para emularlo.comportamiento extraño alrededor del error de compilación "mismo borrado"
Echa un vistazo a este fragmento:
package com.mycompany.playground;
import java.util.ArrayList;
import java.util.Collection;
public class GenericsTest {
public static void main (String[] args) {
System.out.println(GenericsTest.doSomething(new ArrayList<A>()));
System.out.println(0 == GenericsTest.doSomething(new ArrayList<C>()));
}
public GenericsTest() {
}
public static String doSomething(Collection<A> listOfA) {
return "has done something to Collection<A>";
}
public static Integer doSomething(Collection<C> listOfC) {
return 0;
}
private class A {
}
private class C {
}
}
Eclipse Helios con JDK 1.6.0_21 espacio de trabajo por defecto no se compila y se quejaba de que Método doSomething (Colección) tiene el mismo borrado doSomething (Colección) como otro método en tipo GenericsTest. Diría lo mismo sobre el otro método.
Se intentó forzar Eclipse para ejecutarlo y se vio: Excepción en el hilo "principal" java.lang.Error: Problema de compilación no resuelto: El método doSomething (Colección) en el tipo GenericsTest no es aplicable para los argumentos (ArrayList).
Ok. Eso era de esperarse. Ahora. Si entro en mi línea de comando y corro simple:
javac GenericsTest.java
compila. Revisé 1.6.0_21 y 1.6.0_06 (el que tenían los tipos en sus entornos) y ninguno se quejó. Copié los archivos de clase a donde Eclipse los esperaba y los obligué a ejecutarlos nuevamente.
Imprime:
has done something to Collection<A>
true
Si se sustituye la
System.out.println(0 == GenericsTest.doSomething(new ArrayList<C>()));
con
System.out.println(GenericsTest.doSomething(new ArrayList<C>()));
no por ello deja compilar sin advertencias de la línea de comandos, pero dar el mismo "compilación sin resolver problema "al intentar ejecutarlo.
Dos preguntas aquí.
¿Ha superado javac simplemente a los compiladores de Eclipse incorporados? Parece casi exactamente como this previously asked question, así que creo que sé la respuesta. (Por cierto, ¿cómo puedo decirle a Eclipse que use javac en su lugar?).
¿Por qué javac silencio compilar lo java entonces dejará de funcionar (segundo escenario con el {0} == "pista" eliminado?
El compilador de Eclipse es correcto, Sun 'javac' es incorrecto. La Especificación del lenguaje Java lo dice. Específicamente, [Sección 8.1.2 Clases genéricas y parámetros de tipo] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.2) cubre lo que es un tipo genérico y [ 8.4.2 Firma del método] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.2) cubre qué firmas causarán errores en tiempo de compilación. – Powerlord