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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top