编辑:这根本不是代码的问题,而是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不明确<!>错误。

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版本可能有所帮助。

- Flaviu Cipcigan

您编辑的示例适用于我(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 <!>中;部分,确保Eclipse没有为列出的任何操作报告错误(除非您也想要它)。我将我的所有部分设置为<!>“;警告<!>”;然后我会尝试刷新项目并重新启动Eclipse。

编辑: 在更新了帖子之后,我在使用的行上收到了警告(不是错误),说<!>“; Container是原始类型。对泛型类型Container的引用应参数化:<!> quot;。这可以通过以下方式解决:

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

(在我的例子中,我使用java.util.Date代替'AnotherClass')。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top