Question

EDIT: Il s’est avéré que ce n’était pas du tout un problème de code, mais un bogue dans le plug-in Groovy Eclipse ( http://jira.codehaus.org/browse/GRECLIPSE-373 )

Eclipse me donne un étrange message d'erreur concernant les types ambigus dans un fichier Java. programme et je ne comprends vraiment pas pourquoi. J'ai une interface qui prend un paramètre générique indiquant le type de données renvoyé.

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

L'une de ses implémentations ressemble à ceci:

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

Il existe également un conteneur pour une interfaceA

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

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

    public T getA() {
        return a;
    }
}

Cela provoque la " getData est ambigu " erreur.

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

Je suis perplexe sur celui-ci.

Était-ce utile?

La solution

Il semble y avoir un bug causant cela depuis le plugin groovy. http://jira.codehaus.org/browse/GRECLIPSE-373 . Ce n'est pas un problème de Java du tout. Merci pour l'aide et mes excuses.

Autres conseils

Collection<T> getData() défini dans Impl doit être rendu public . Si je le fais, le code se compile proprement pour moi.

Comme d'autres afficheurs l'ont dit, je ne vois pas ce problème sur Eclipse 3.5.0 fonctionnant sous JDK 1.6.0.14 (lors de la résolution du problème de visibilité réduite de la méthode getData()).

Je suggère de faire un build propre (Project / Clean dans Eclipse). Les versions Eclipse et Java que vous utilisez peuvent également vous aider.

- Flaviu Cipcigan

Votre exemple modifié fonctionne bien pour moi (JDK 1.5), à l'exception que vous devez définir le type générique sur le constructeur. Voici mon code de travail complet:

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();
}

[Modifier pour refléter la question mise à jour]

Cela ne devrait même pas être compilé car vous réduisez la visibilité de la méthode du public à la portée du package:

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

Et ce compile toujours pour moi (Eclispe 3.4, OS X, 1.5), vous ne savez donc pas exactement quel est le problème:

package temp.tests;

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();
        }
    }
}

Ce que vous avez ici semble légitime. Eclipse montre peut-être une erreur, ce qui ne devrait pas autrement.

Accédez à Windows > Préférences & Gt; Java & Gt; Compilateur & Gt; Erreurs / Avertissements. Dans les & Quot; types génériques & Quot; section, assurez-vous qu'Eclipse ne signale pas d'erreur pour les opérations répertoriées (à moins que vous ne le souhaitiez également). Tous les miens de cette section sont réglés sur & "Avertissement &"; Je voudrais ensuite essayer d'actualiser le projet et de redémarrer Eclipse.

Modifier: Après la publication du message mis à jour, j'ai reçu un avertissement (pas encore une erreur) sur les lignes d'utilisation, indiquant que & "Container est un type brut. Les références au type générique Container doivent être paramétrées: & Quot ;. Cela peut être corrigé par:

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

(Dans mon exemple, j'utilise java.util.Date au lieu de 'AnotherClass').

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top