【问题标题】:Weird Generics Behaviour with Interface接口的奇怪泛型行为
【发布时间】:2013-11-02 01:20:44
【问题描述】:

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

public class Foo<T extends Comparable<T>>

Foo 类里面我有类似的东西:

public void bar(T t)

我确信我可以编写如下代码:t.compareTo(v)

问题 1: 为什么在使用泛型时,我们使用 extends 而不是 implements 作为接口? Comparable 不是一个类。

\\

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

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

然后我更改类 Foo 以实现 Face (public class Foo&lt;T extends Comparable&lt;T&gt;&gt; implements Face)。

问题 2: 执行此操作时出现以下编译错误:

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

这是为什么?

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

【问题讨论】:

    标签: java generics interface extends implements


    【解决方案1】:
    1. 不能代表 Java 泛型的设计者,但大概他们这样做是为了简化语言。 X extends Y 约束的要点是我们要指定 X 可分配给类型 Y - 最后,Y 是接口还是类并不重要,因此让您使用 implementsextends 基于 Y 是其中一个还是另一个似乎很麻烦。
    2. 试一试:public class Foo&lt;T extends Comparable&lt;T&gt;&gt; implements Face&lt;T&gt;——Face是一个带类型参数的接口,所以扩展接口时需要填写那个类型参数。

    【讨论】:

      【解决方案2】:

      请重新格式化您的问题。但是,如果我在那里理解了什么,请执行以下操作:

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

      【讨论】:

        猜你喜欢
        • 2015-07-02
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 2011-01-07
        • 2021-10-28
        • 1970-01-01
        • 2019-05-25
        • 1970-01-01
        相关资源
        最近更新 更多