我已经查看了类似的问题并且做得很短,所以就这样了;
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类型的应用(F)具有相同的擦除但不覆盖它”
看起来它应该工作,任何人都有任何关于发生了什么的想法?
[编辑] 所以看起来这是eclipse的一个问题,Galileo没有显示这个错误,而Helios也是如此。我已经提交了一个关于eclipse的错误报告,一旦得到回复就会更新。
[编辑] 更改为更简单的情况,显示相同的错误,但消除了有关擦除的混淆。
答案 0 :(得分:2)
代码 DOES 有效。在这里稍微改写为ideone.com的一个类:
interface Predicate<T>{
boolean apply(T t);
}
interface Function<F, T>{
T apply(F f);
}
class Foo {}
class Bar {}
class Two<K, V>{
private K k;
private V v;
public Two(K k, V v) {
this.k = k;
this.v = v;
}
public K getKey() {return k;}
public V getValue() {return v;}
}
然后是好消息:
abstract class NewPredicate
implements Predicate<Foo>, Function<Two<Foo, Bar>, Boolean>{
}
class ConcretePredicate extends NewPredicate{
@Override
public boolean apply(Foo foo){ return false; }
@Override
public Boolean apply(Two<Foo, Bar> two){ return null; }
}
public class Main {
public static void main(String[] args) {
System.out.println(new ConcretePredicate());
}
}
代码编译并运行正常(as seen on ideone.com,Eclipse和javac 1.6.0_17
)。
这些与实际的“具有相同的擦除...但不覆盖它”编译器错误消息:
答案 1 :(得分:0)
正在发生的是type erasure。
要实现此功能,您需要更改其中一个apply
方法的名称。
答案 2 :(得分:0)
我已经向eclipse团队提交了一份错误报告,他们仍在争论JLS的语义及其含义,但似乎我的问题确实是eclipse Helios中的一个错误。看起来我将不得不降级到伽利略,直到这个问题得到解决。