Pergunta

EDIT: Este acabou por não ser um problema com o código em tudo, mas com um bug no plugin Groovy Eclipse ( http://jira.codehaus.org/browse/GRECLIPSE-373 )

Eclipse está me dando uma mensagem de erro estranho sobre tipos ambíguos em um Java programa e eu realmente não entendo o porquê. Eu tenho uma interface que leva um parâmetro genérico indicando que tipo de dados ele retorna.

public interface InterfaceA<T> {
    T getData();
}

Uma das implementações de ele se parece com isso:

public class Impl<T extends AnotherClass> implements InterfaceA<Collection<T>> {
    public Collection<T> getData() {
       // get the data
    }
}

Há também um recipiente para um InterfaceA

public class Container<T extends InterfaceA>
{
    private T a;

    public Container(T a) {
        this.a = a;
    }

    public T getA() {
        return a;
    }
}

Isso faz com que o "getData é ambíguo" de erro.

Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>());
Collection<AnotherClass> coll = c.getA().getData();

Eu estou perplexo sobre este.

Foi útil?

Solução

Não parece ser um bug causando isso a partir do plug-in Groovy. http://jira.codehaus.org/browse/GRECLIPSE-373 . Não é um problema de java em tudo. Obrigado pela ajuda e as minhas desculpas.

Outras dicas

Collection<T> getData() definido no necessidades Impl a ser feita public . Se eu fizer isso o código compila limpa para mim.

Como outros cartazes disse, eu não estou vendo esse problema em Eclipse 3.5.0 rodando em JDK 1.6.0.14 (ao fixar a visibilidade reduzida do método getData()).

Eu sugiro fazer uma compilação limpa (Project / Limpa no Eclipse). Além disso, a versão do Eclipse e Java você está executando pode ajudar.

- Flaviu Cipcigan

Seu exemplo editado funciona bem para mim (JDK 1.5), com excepção, que você tem que definir o tipo genérico do construtor. Aqui está o meu código de trabalho completo:

public interface InterfaceA<T> {
    T getData();
}

public static class Impl<T extends Date> implements InterfaceA<Collection<T>> {
    public Collection<T> getData() {
        return null;
    }
}

public static class Container<T extends InterfaceA> {
    private T a;

    public Container(T a) {
        this.a = a;
    }

    public T getA() {
        return a;
    }

}

public static void main(String[] args) {
    Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>());
    Collection<Date> coll = c.getA().getData();
}

[Edit para refletir questão atualizado]

Isto não deve sequer compilar como você está reduzindo a visibilidade do método de público para escopo do pacote:

public class Impl<T extends AnotherClass> implements InterfaceA<Collection<T>> {
    Collection<T> getData() {
       // get the data
    }
}

E isto ainda compila para mim (Eclispe 3.4, OS X, 1.5), então não sei o que é exatamente a questão:

temp.tests pacote;

import java.util.Collection;

public interface InterfaceA <T> {

    T getData();

    public static final class AnotherClass {}

    public static final class Impl<T extends AnotherClass> 
             implements InterfaceA<Collection<T>>
   {
        public Collection<T> getData () {
            return null;
        }
    }

    public static class Container<T extends InterfaceA>
    {
        private T a;
        public Container(T a) { this.a = a; }
        public T getA() { return a; }
    }

    public static final class Test {
        public static void main (String[] args) {
            Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>());
            Collection<AnotherClass> coll = c.getA().getData();
        }
    }
}

O que você tem aqui parece legítimo. Talvez Eclipse está mostrando um erro que de outra forma não deveria.

Ir para o Windows> Preferências> Java> Compiler> Erros / avisos. Na seção "Tipos genéricos", garantir que Eclipse não está relatando um erro para qualquer das operações mencionadas (a menos que você quer que ele também). Eu tenho todo meu nesse conjunto a seção "Aviso". Eu, então, tente atualizar o projeto e reiniciar Eclipse.

Edit: Após o post atualizado foi feito, eu tenho um aviso (não um erro ainda) nas linhas de uso, dizendo "Container é um tipo cru Referências a tipo genérico recipiente deve ser parametrizado:.". Isso pode ser corrigido por:

Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>());

(No meu exemplo, eu estou usando java.util.Date como no lugar de 'AnotherClass').

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