扩展多个接口时Java Generics Name Clash错误

时间:2010-08-05 20:00:35

标签: java generics

我已经查看了类似的问题并且做得很短,所以就这样了;

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的错误报告,一旦得到回复就​​会更新。

[编辑] 更改为更简单的情况,显示相同的错误,但消除了有关擦除的混淆。

3 个答案:

答案 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中的一个错误。看起来我将不得不降级到伽利略,直到这个问题得到解决。

Bugzilla Entry