Por que Eclipse compilar este, mas javac não?
-
19-09-2019 - |
Pergunta
Temos alguns testes de unidade que compilação e multa de execução em Eclipse 3.4, mas quando tentamos compilá-los usando javac, ele falhar. Eu consegui cortar o baixo código para algo pequeno e auto-suficiente, por isso não tem dependências externas. O código em si não faz muito sentido, porque é tudo fora de contexto, mas isso não importa - Eu só preciso descobrir por que javac não faz assim:
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;
}
}
Eu tentei com JDK 1.5.0_10
e 1.6.0_13
, com o mesmo resultado:
Test.java:6: matchOn(test.SubMatcher) in test.Test cannot be applied to (test.BaseMatcher)
matchOn(someMatcher().with(anotherMatcher()));
^
1 error
Eu acho que isso é perfeitamente válido Java. O método SubMatcher.with () retorna um tipo mais específico do que BaseMatcher.with (), mas o compilador parece pensar que o tipo de retorno é BaseMatcher. No entanto, é possível que o compilador Eclipse é incorretamente permitindo algo que não deve ser.
Todas as idéias?
Solução
em BaseMatcher você precisa especificar parâmetros de tipo:
public SubMatcher with(Matcher<?, ?> matcher) {
, a fim de permitir que javac para combinar com seu método with
PS
imho é um bug do eclipse compilador
Outras dicas
Eu fiz isso construir com sucesso, adicionando <?,?>
para Matcher
em SubMatcher.with
:
class SubMatcher extends BaseMatcher {
@Override
public SubMatcher with(Matcher<?,?> matcher) {
return this;
}
}
Sem isso, a assinatura do método é diferente da base. Gostaria de saber se há um erro na verificação @Override
que não consegue perceber isso.
Verifique qual JRE ou JDK que você está compilando com tanto Eclipse e terminal. Talvez poderia ser o problema de versão.
funciona para mim:
$ java -version openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-****-2009_07_23_10_21-b00) OpenJDK 64-Bit Server VM (build 16.0-b06, mixed mode) $ javac -XDrawDiagnostics Test.java $
Lembro-me vagamente de tal bugreport, mas não pode dar-lhe um link para ele no momento.