界面奇怪的泛型行为

时间:2013-11-02 01:20:44

标签: java generics interface extends implements

我想创建一个泛型类,它接受一些可比较的泛型类型的元素。所以我这样做:

public class Foo<T extends Comparable<T>>

在课堂内Foo我有类似的东西:

public void bar(T t)

我确信我可以编写这样的代码:t.compareTo(v)

问题1:为什么在使用泛型时,我们为接口设置了extends而不是implementsComparable不是一个班级。

\\

现在假设我想创建另一个类似于上面也在实现的类 bar方法。我想创建这个界面:

public interface Face<T extends Comparable<T>> {
    public void bar(T t);
}

然后我更改了课程Foo以实施Facepublic class Foo<T extends Comparable<T>> implements Face)。

问题2:执行此操作时,我收到以下编译错误:

Foo类型的方法栏(T)必须覆盖或实现超类型方法

为什么会这样?

当我告诉Eclipse add the unimplemented methods时,我得到: public void bar(Comparable t)代替... bar(T t)

2 个答案:

答案 0 :(得分:5)

  1. 不能代表Java泛型的设计者,但可能他们这样做是为了简化语言。 X extends Y约束的要点是我们要指定X可分配给类型Y - 最后,Y是接口还是类是无关紧要的,因此,根据implements是一个还是另一个看似麻烦,让您使用extendsY
  2. 尝试:public class Foo<T extends Comparable<T>> implements Face<T> - Face是一个带有类型参数的接口,因此在扩展界面时需要填写该类型参数。

答案 1 :(得分:1)

请稍微重新格式化您的问题。但如果我理解了那些,那就这样做:

// Face<T>, not just Face
public class Foo<T extends Comparable<T>> implements Face<T> {
}