gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:22:29 25 4
gpt4 key购买 nike

我有一个关于 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 接口(interface)中施加该限制,因为所有实现都不需要该限制。这可能吗?我应该如何解决?

提前致谢!

编辑 1:修复错别字类 --> 类和接口(interface) --> 接口(interface)。但是返回类型仍然是 void,而不是 T,我想这是无关紧要的。我的实际返回类型是 boolean 值。

编辑 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;
}

}

最佳答案

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

这归结为 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) {
...
}
}

关于Java:在子类型中指定泛型类型限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21658622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com