gpt4 book ai didi

java - 泛型、比较器和测试用例

转载 作者:太空宇宙 更新时间:2023-11-04 06:13:51 31 4
gpt4 key购买 nike

此作业是我的 Java 类泛型部分的一部分。我认为我的头脑因过于笼统而无法理解笼统性。对于这个特定的类,我必须为给定的任何通用集合实现一个最小(和其他几个)方法,并使用给定的比较器(comp)来评估它们。

实现代码:

public static <T> T min(Collection<T> c, Comparator<T> comp)
throws IllegalArgumentException, NoSuchElementException {
if (c != null && comp != null) {
if (!c.isEmpty()) {
T min = (T) null;

for (T t : c) {
if (min == null) {
min = t;
} else if (comp.compare(t, min) < 0) {
min = t;
}
}

return min;

} else {
throw new NoSuchElementException();
}
} else {
throw new IllegalArgumentException();
}
}

我的问题是我不知道如何用我的一个比较器测试这种方法。我将解释我读过的内容/我是如何理解它的,如果你们能告诉我哪里遗漏了一些东西,那就太好了。

如果我想在类内进行比较(添加我自己的比较/compareTo 方法):

public class Example<T extends Comparator<T>> {

}

如果我想编写自己的单独的类作为比较器:

public class ExampleComp<T> implements Comparator<T> {
@override
public int compare(T o1, T o2) {
//do fancy things here
}
}

这意味着我编写测试用例的方式应该是实现我自己的比较器类,并在我的方法调用中将 new ExampleComp() 作为变量传递。

因此,如果我的理解都是正确的,那么我该如何编写测试用例来比较所有内容?集合应该尽可能通用,那么如何实现将一个片段与另一个片段进行比较的方法,同时保持所有内容的类型安全?

最佳答案

目前,您的所有类型都是不变的。 Collection<T>是一个组件类型为 T.A List<T> 的集合将匹配此类型,但集合不会。还有另外两种可能使用通配符的组件定义,即协变组件类型 ( <? extends T> ) 和逆变组件类型 ( <? super T> )。

就您而言,我们可以使 Collection 协变,但这意味着您的结果类型将取决于 Comparator 类型。因此,首选的解决方案是使比较器逆变。然后你的方法就变成了:

public static <T> T min(Collection<T> c, Comparator<? super T> comp)
throws IllegalArgumentException, NoSuchElementException {…}

这是可行的,因为我们的 comp 将采用任何至少比较 T 父类(super class)型的比较器。所以,如果您有 class Person和一个子类 VeryIncompetentPerson ,一个Comparator<Person>足以从一群非常无能的人中获得最低限度的报酬。

关于java - 泛型、比较器和测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28350633/

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