2

我对 Java 中的泛型类型有疑问。具体来说,目前我有一些类似这样的代码:

public interface Foo {
   public <T> void bar(T[] list)
}

public class FooImpl implements Foo{
   @Override
   public <T extends Comparable<? super T>> void bar(T[] list) {
       ...
   }
}

问题是,编译器现在抱怨说我没有在我的 FooImpl 类中实现 bar 方法。

我想要的是对泛型类型施加一些额外的限制,特别是它们应该具有可比性。但我不想把这个限制放在我的 Foo 接口中,因为所有实现都不需要这个限制。这可能吗,我应该怎么做才能解决它?

提前非常感谢!

编辑 1:修正了拼写错误类 --> 类和接口 --> 接口。但是返回类型仍然是无效的,而不是 T,这是无关紧要的,我想。我的实际返回类型是布尔值。

编辑2:实际代码,按要求:

public interface SortedCriteria {

    public <E> boolean isSorted(E[] list);

}

public class AscendingCriteria implements SortedCriteria {

    @Override
    public <E extends Comparable<? super E>> boolean isSorted(E[] list) {
        int length = list.length;
        for (int i = 1; i < length; i++) {
            if (list[i].compareTo(list[i-1]) < 0) return false;
        }
        return true;
    }

}
4

1 回答 1

1

你想做的被拒绝,因为它会完全破坏多态性。具有 Foo 实例的调用者可能具有您的子类的实例或任何其他子类的实例。并且由于接口保证可以使用任何类型的数组作为参数调用该方法,因此您的子类不能通过限制它接受的数组类型来破坏这个契约(除非它在运行时通过检查数组的类型来这样做)当然,通过抛出异常)。

这归结为 Liskov 替换原则,这是多态性和 OO 的基础。

但也许您真正想要的是使 Foo 成为泛型类型:

public interface Foo<T> {
    public void bar(T[] list);
}

public class FooImpl<T extends Comparable<? super T>> implements Foo<T> {
   @Override
   public void bar(T[] list) {
       ...
   }
}
于 2014-02-09T12:04:11.480 回答