打扰一下,我可能会提出一些多余的问题,但是最近我一直在学习泛型,对如何测试它们有些困惑。
这是我的代码,用于在集合中查找最小值:
public static <T> T min(Collection<T> c, Comparator<T> comp) {
if (c == null || comp == null) {
throw new IllegalArgumentException("Collection or comparator is null.");
}
if (c.isEmpty()) {
throw new NoSuchElementException("Collection is empty.");
}
Iterator<T> itr = c.iterator();
T min = itr.next();
if (itr.hasNext()) {
for (T i : c) {
if (comp.compare(i, min) < 0) {
min = i;
}
}
}
return min;
}
这是我为此方法准备的最小测试用例:
public class SelectorTest{
@Test
public void min() {
Comparator<Integer> intSort = new IntegerSort();
Integer[] test = {2, 8, 7, 3, 4};
int expected = 2;
int actual = Selector.min(test, intSort);
Assert.assertEquals(expected, actual);
}
public static class IntegerSort implements Comparator<Integer> {
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
}
}
我从此代码中收到的编译器错误如下:
required:java.util.Collection<T>,java.util.Comparator<T>
found: java.lang.Integer[],java.util.Comparator<java.lang.Integer>
很明显,我通过测试用例的参数不是应该传递的参数,但是我的想法是这样的:我正在传递一个整数数组,该数组是一个集合,并且我给出根据min方法的要求,它是整数的特定比较器。
我应该如何修复此测试用例,使其以这种方式有效地工作,并且不仅要与Integers一起工作,而且要与min方法能够执行的任何Collection类一起工作?
我以前从未成功编写过通用的测试用例,所以我对如何做到这一点感到困惑。
谢谢!
答案 0 :(得分:3)
您的问题与泛型无关。当方法需要Collection时,不能将数组作为参数传递。数组不实现Collection接口。如果您要传递ArrayList的实例,它应该可以正常工作。