Java模糊类型的方法?
-
06-07-2019 - |
题
编辑:这根本不是代码的问题,而是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')。