3

編集: これはコードの問題ではなく、Groovy Eclipse プラグイン ( http://jira.codehaus.org/browse/GRECLIPSE-373 )のバグであることが判明しました。

Eclipseは、Java プログラムのあいまいな型に関する奇妙なエラー メッセージを表示しますが、その理由がよくわかりません。返されるデータの種類を示すジェネリック パラメーターを受け取るインターフェイスがあります。

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

その実装の1つは次のようになります。

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

InterfaceAのコンテナもあります

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

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

    public T getA() {
        return a;
    }
}

これを行うと、「getData is ambiguous」エラーが発生します。

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

私はこれに困惑しています。

4

6 に答える 6

6

これは、groovy プラグインに起因するバグのようです。http://jira.codehaus.org/browse/GRECLIPSE-373。これは Java の問題ではありません。助けてくれてありがとう。

于 2009-10-23T14:59:00.227 に答える
2

Collection<T> getData()で定義されているものを公開Implする必要があります。これを行うと、コードはきれいにコンパイルされます。

于 2009-10-23T14:14:12.563 に答える
0

あなたがここに持っているものは合法のようです。おそらく、Eclipseは、他の方法では表示されないはずのエラーを表示しています。

[Windows]>[設定]>[Java]>[コンパイラ]>[エラー/警告]に移動します。「汎用タイプ」セクションで、リストされている操作のいずれについてもEclipseがエラーを報告していないことを確認します(必要な場合を除く)。私はそのセクションのすべての私のものを「警告」に設定しています。次に、プロジェクトを更新してEclipseを再起動してみます。

編集:更新された投稿が行われた後、使用行に「コンテナーはraw型です。ジェネリック型Containerへの参照はパラメーター化する必要があります:」という警告が表示されました(まだエラーではありません)。これは次の方法で修正できます。

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

(私の例では、「AnotherClass」の代わりにjava.util.Dateを使用しています)。

于 2009-10-23T14:16:13.247 に答える
0

他の投稿者が言っているように、JDK 1.6.0.14 で実行されている Eclipse 3.5.0 ではこの問題は見られません (getData()メソッドの可視性の低下を修正する場合)。

クリーン ビルド (Project/Clean in Eclipse) を行うことをお勧めします。また、実行している Eclipse と Java のバージョンも役立つ場合があります。

-- フラビウ・シプシガン

于 2009-10-23T14:25:55.643 に答える
0

編集した例は、コンストラクターでジェネリック型を定義する必要があるという例外を除いて、私 (JDK 1.5) では正常に機能します。ここに私の完全な作業コードがあります:

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();
}
于 2009-10-23T14:11:08.370 に答える
0

[更新された質問を反映するように編集]

メソッドの可視性を public から package スコープに減らしているため、これはコンパイルすることさえできません。

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

そして、これはまだ私のためにコンパイルされます(Eclispe 3.4、OS X、1.5)ので、正確に何が問題なのかわかりません:

パッケージ 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();
        }
    }
}
于 2009-10-23T14:22:20.423 に答える