メソッドのJava曖昧なタイプ?
-
06-07-2019 - |
質問
編集:これはコードの問題ではなく、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;
}
}
これを行うと、<!> quot; getData is ambiguous <!> quot;エラー。
Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>());
Collection<AnotherClass> coll = c.getA().getData();
これには困惑しています。
解決
これは、groovyプラグインに起因するバグのようです。 http://jira.codehaus.org/browse/GRECLIPSE-373 。 Javaの問題ではありません。ヘルプと謝罪をありがとう。
他のヒント
Collection<T> getData()
で定義された Impl
は、公開にする必要があります。これを行うと、コードがきれいにコンパイルされます。
他のポスターが言ったように、JDK 1.6.0.14で実行されているEclipse 3.5.0でこの問題は見られません(getData()
メソッドの可視性の低下を修正する場合)。
クリーンビルド(EclipseのProject / Clean)を実行することをお勧めします。また、実行しているEclipseおよびJavaバージョンが役立つ場合があります。
-フラビウシプシガン
編集したサンプルは、コンストラクターでジェネリック型を定義する必要があるという例外を除いて、私(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();
}
[更新された質問を反映するように編集]
メソッドの可視性をパブリックスコープからパッケージスコープに減らしているため、これはコンパイルすらすべきではありません。
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();
}
}
}
ここにあるものは正当なものです。おそらく、Eclipseがエラーを示しているはずです。
Windowsに移動<!> gt;設定<!> gt; Java <!> gt;コンパイラ<!> gt;エラー/警告。 <!> quot; Generic Types <!> quot;セクションで、Eclipseがリストされた操作のいずれについてもエラーを報告していないことを確認します(必要な場合を除く)。そのセクションの私のすべてを<!> quot; Warning <!> quot;に設定しています。次に、プロジェクトを更新し、Eclipseを再起動します。
編集: 更新された投稿が作成された後、<!> quot; Containerはrawタイプであるという警告が表示されます(まだエラーではありません)。ジェネリック型コンテナへの参照はパラメータ化する必要があります:<!> quot;。これは次の方法で修正できます。
Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>());
(私の例では、「AnotherClass」の代わりにjava.util.Dateを使用しています)。