【发布时间】:2010-08-05 20:00:35
【问题描述】:
我已经查看了类似的问题,但提出了一些问题,所以就这样吧;
public interface Predicate<T>{
boolean apply(T t);
}
public interface Function<F, T>{
T apply(F f);
}
public class ConcretePredicate extends Predicate<Foo>, Function<Bar, Boolean>{
@Override
public boolean apply(Foo foo){/*stuff*/}
@Override
public Boolean apply(Bar bar){/*stuff*/}
}
ConcretePredicate 显示错误,
“名称冲突:Predicate 类型的方法 apply(T) 与 Function 类型的 apply(F) 具有相同的擦除,但不会覆盖它”
看起来它应该可以工作,有人对发生了什么有任何想法吗?
[编辑] 所以看起来这是 eclipse 的问题,Galileo 没有显示这个错误,而 Helios 有。我已经用 eclipse 提交了一个错误报告,一旦我得到回复就会更新。
[编辑] 更改为更简单的情况,显示相同的错误但消除了有关擦除的混淆。
【问题讨论】:
-
你用的是什么编译器?我无法复制。
-
面向 Java 开发人员的 Eclipse IDE 1.3.0.20100617-0520 jdk1.0.6_13
-
apply(T t)在运行时与apply(F f)相同(泛型由编译器检查并转换为Object,并插入适当的强制转换)。不过,我目前无法进行测试,并且其他答案声称它有效,因此我无法给出明确的答案 - 请将此作为评论。 -
真棒,真棒的问题。我很困惑,因为我到处都发现矛盾(例如bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950 中的代码对我来说编译得很好)。