我对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;
}
}
答案 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) {
...
}
}