Java:在子类型中指定泛型类型限制

时间:2014-02-09 11:42:19

标签: java generics subtyping

我对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:修正拼写错误类 - &gt;类和接口 - &gt;接口。但是我认为返回类型仍然无效,而不是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;
    }

}

1 个答案:

答案 0 :(得分: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) {
       ...
   }
}
相关问题