编辑:这根本不是代码的问题,而是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();
我很难过这个。
答案 0 :(得分:5)
似乎有一个错误导致groovy插件出现这种情况。 http://jira.codehaus.org/browse/GRECLIPSE-373。它根本不是java问题。感谢您的帮助和道歉。
答案 1 :(得分:2)
Collection<T> getData()
中定义的 Impl
需要公开。如果我这样做,代码会为我编译干净。
答案 2 :(得分: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();
}
答案 3 :(得分:0)
你在这里看到的似乎是合法的。也许Eclipse显示错误,否则不应该。
转到Windows&gt;偏好&gt; Java&gt;编译器&gt;错误/警告。在“通用类型”部分中,确保Eclipse没有为列出的任何操作报告错误(除非您也想要它)。我将该部分的所有部分设置为“警告”。然后我会尝试刷新项目并重新启动Eclipse。
编辑: 在更新后的帖子之后,我在使用的行上得到了一个警告(不是错误),说“Container是一个原始类型。对泛型类型Container的引用应该参数化:”。这可以通过以下方式解决:
Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>());
(在我的例子中,我使用java.util.Date代替'AnotherClass')。
答案 4 :(得分: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();
}
}
}
答案 5 :(得分:0)
正如其他海报所说,我在JDK 1.6.0.14上运行的Eclipse 3.5.0上没有看到这个问题(当修复getData()
方法的可见性降低时)。
我建议做一个干净的构建(Eclipse中的Project / Clean)。此外,您运行的Eclipse和Java版本可能有所帮助。
- Flaviu Cipcigan