Java tipo ambígua para o método?
-
06-07-2019 - |
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.
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').