3

编辑:结果证明这根本不是代码问题,而是 Groovy Eclipse 插件中的一个错误(http://jira.codehaus.org/browse/GRECLIPSE-373

Eclipse给我一个关于 Java 程序中不明确类型的奇怪错误消息,我真的不明白为什么。我有一个接口,它接受一个通用参数,指示它返回的数据类型。

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

它的一种实现如下所示:

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

您编辑的示例对我来说很好(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

你在这里所拥有的似乎是合法的。也许 Eclipse 正在显示一个错误,否则它不应该。

转到 Windows > 首选项 > Java > 编译器 > 错误/警告。在“通用类型”部分中,确保 Eclipse 没有为列出的任何操作报告错误(除非您也需要它)。我将该部分中的所有内容都设置为“警告”。然后我会尝试刷新项目并重新启动 Eclipse。

编辑:更新后的帖子发布后,我在使用行上收到警告(仍然不是错误),说“容器是原始类型。对泛型容器的引用应该参数化:”。这可以通过以下方式解决:

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

(在我的示例中,我使用 java.util.Date 代替“AnotherClass”)。

于 2009-10-23T14:16:13.247 回答
0

[编辑以反映更新的问题]

这甚至不应该编译,因为您正在将方法的可见性从公共范围降低到包范围:

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 回答
0

正如其他张贴者所说,我在 JDK 1.6.0.14 上运行的 Eclipse 3.5.0 上没有看到这个问题(在修复该getData()方法的可见性降低时)。

我建议做一个干净的构建(Eclipse 中的 Project/Clean)。此外,您正在运行的 Eclipse 和 Java 版本可能会有所帮助。

——弗拉维乌·西普西根

于 2009-10-23T14:25:55.643 回答