Tenemos algunas pruebas unitarias que se compilan y ejecutan bien en Eclipse 3.4, pero cuando intentamos compilarlas usando javac, falla. He logrado reducir el código a algo pequeño y autónomo, por lo que no tiene dependencias externas. El código en sí no tiene mucho sentido porque es todo fuera de contexto, pero eso no importa - sólo hay que averiguar por qué javac no le gusta esto:¿Por qué Eclipse compila esto, pero javac no?
public class Test {
public void test() {
matchOn(someMatcher().with(anotherMatcher()));
}
void matchOn(SubMatcher matcher) {}
SubMatcher someMatcher() {
return new SubMatcher();
}
Matcher anotherMatcher() {
return null;
}
}
interface Matcher <U, T> {}
class BaseMatcher implements Matcher {
public BaseMatcher with(Matcher<?,?> matcher) {
return this;
}
}
class SubMatcher extends BaseMatcher {
@Override
public SubMatcher with(Matcher matcher) {
return this;
}
}
He tratado con JDK 1.5.0_10
y 1.6.0_13
, con el mismo resultado:
Test.java:6: matchOn(test.SubMatcher) in test.Test cannot be applied to (test.BaseMatcher)
matchOn(someMatcher().with(anotherMatcher()));
^
1 error
creo que esto es perfectamente válido de Java. El método SubMatcher.with() devuelve un tipo más específico que BaseMatcher.with(), pero el compilador parece pensar que el tipo de devolución es BaseMatcher. Sin embargo, es posible que el compilador de Eclipse esté permitiendo incorrectamente algo que no debería ser.
¿Alguna idea?
Puedo reproducir este error de compilación con jdk 1.6 en Linux. Parece que los tipos de retorno covariantes introducidos con Java 1.5 no funcionan correctamente en este ejemplo. – Mnementh