Frage

EDIT: Dies erwies sich als überhaupt kein Problem mit dem Code, aber mit einem Fehler in der Groovy Eclipse-Plugin ( http://jira.codehaus.org/browse/GRECLIPSE-373 )

Eclipse- gibt mir eine seltsame Fehlermeldung über mehrdeutige Typen in einer Java programmieren und ich verstehe wirklich nicht, warum. Ich habe eine Schnittstelle, die einen generischen Parameter nimmt angibt, welche Art von Daten es zurückgibt.

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

Eine der Implementierungen sieht es wie folgt aus:

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

Es gibt auch einen Behälter für eine InterfaceA

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

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

    public T getA() {
        return a;
    }
}

Dadurch verursacht die "getData ist mehrdeutig" Fehler.

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

Ich bin auf dieser stumped.

War es hilfreich?

Lösung

Es scheint ein Fehler verursacht dies vom groovigen Plugin werden. http://jira.codehaus.org/browse/GRECLIPSE-373 . Es ist kein Java-Problem. Danke für die Hilfe und ich entschuldige mich.

Andere Tipps

Collection<T> getData() in Impl definiert gemacht werden muss Öffentlichkeit . Wenn ich dies tun der Code kompiliert für mich sauber.

Wie andere Plakate gesagt haben, ich sehe dieses Problem nicht auf Eclipse 3.5.0 läuft auf JDK 1.6.0.14 (wenn die reduzierte Sichtbarkeit des getData() Verfahrens zur Festsetzung).

Ich schlage vor, dabei einen bereinigter Build (Projekt / Sauber in Eclipse). Außerdem laufen könnte die Eclipse und Java-Version helfen.

- Flaviu Cipcigan

Ihre editierten Beispiel funktioniert für mich (JDK 1.5), mit Ausnahme fein, dass Sie den generischen Typ auf den Konstruktor zu definieren. Hier ist mein kompletter Arbeits Code:

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 aktualisiert, um Frage]

Dies sollte nicht einmal kompilieren, wie Sie die Sichtbarkeit des Verfahrens aus öffentlichem reduzieren Umfang zu verpacken:

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

Und das kompiliert noch für mich (eclispe 3.4, OS X, 1,5), so weiß nicht, was genau das Problem ist:

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

Was Sie hier haben, scheint legitim. Vielleicht ist Eclipse-einen Fehler zeigt, sonst sollte es nicht.

Gehen Sie

Windows> Einstellungen> Java> Compiler> Fehler / Warnungen. In dem „Generic Typen“ Abschnitt, stellen Sie sicher, dass Eclipse-nicht einen Fehler für jede der Operationen aufgelistet berichtet (es sei denn, Sie es auch wollen). Ich habe alle meine in diesem Abschnitt auf „Warnung“. Ich würde dann versuchen, das Projekt erfrischend und Eclipse neu zu starten.

Edit: Nach dem aktualisierten Post gemacht wurde, bekam ich eine Warnung (keinen Fehler noch) auf den Linien der Nutzung, sagte „Container eine rohe Art ist Verweis auf generischen Typ Container parametriert werden soll.“. Dies kann durch die festgelegt werden:

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

(In meinem Beispiel verwende ich java.util.Date wie anstelle von 'Anderen').

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top