Java 为什么JUnit4中的assertEquals(对象[],对象[])不受欢迎?
Eclipse给了我一个警告,说类型Java 为什么JUnit4中的assertEquals(对象[],对象[])不受欢迎?,java,junit,assert,Java,Junit,Assert,Eclipse给了我一个警告,说类型Assert中的方法assertEquals(Object[],Object[])已被弃用。我正在使用JUnit4 我在Eclipse中编写了以下代码: import org.junit.Test; import org.junit.Assert; public class Generics { public <T> T[] genericArraySwap(T[] list, int pos1, int pos2) throws In
Assert
中的方法assertEquals(Object[],Object[])
已被弃用。我正在使用JUnit4
我在Eclipse中编写了以下代码:
import org.junit.Test;
import org.junit.Assert;
public class Generics {
public <T> T[] genericArraySwap(T[] list, int pos1, int pos2) throws IndexOutOfBoundsException {
...
}
@Test
public void genericArraySwapTest() {
Integer[] IntegerList = {0, 1, 2, 3, 4};
Assert.assertEquals(new Integer[] {0, 1, 2, 4, 3}, genericArraySwap(IntegerList, 3, 4));
}
}
import org.junit.Test;
导入org.junit.Assert;
公共类泛型{
public T[]genericArraySwap(T[]list,int pos1,int pos2)抛出IndexOutOfBoundsException{
...
}
@试验
public void genericArraySwapTest(){
整数[]整数列表={0,1,2,3,4};
Assert.assertEquals(新的整数[]{0,1,2,4,3},genericArraySwap(IntegerList,3,4));
}
}
有人能告诉我为什么不推荐使用这个方法,或者我应该使用什么方法来代替吗?因为Java类型系统缺乏表达能力,所以不推荐使用它 尽管所有其他
assertEquals
方法将使用=
(对于基本体)或equals
(对于引用类型)来比较参数,但您不希望使用这两种方法来比较数组:所有数组都是对象的子类型(即,它们是引用类型),并且不重写equals
,因此,使用assertEquals
比较数组将检查两个数组是否相同
相反,您应该调用assertArrayEquals
,它比较数组是否具有相同的长度,如果是,则比较相应的数组元素是否相等
理想情况下,您可以指定如下参数类型:
assertEquals(T, T)
其中,T
是“对象的任何子类型,数组除外”。但在Java中,您根本无法做到这一点;即使有一种表达这种约束的方法,您也无法阻止使用array调用该方法,因为您始终可以将它们上溯到对象
s
你唯一能做的就是:
- 提供接受
对象的重载
- 提供接受更多特定类型的重载,并将这些重载标记为已弃用。要覆盖所有数组类型,您需要9个重载(每个基元数组类型8个;1个用于
Object[]
,它覆盖所有其他引用类型)
这并不妨碍您调用assertEquals(t[],t[])
,但它确实通过编译器警告强调了存在问题;黄色在日食中蠕动;等等
当然,如果您将数组向上投射到对象
,这将不会有帮助;但是,在大多数情况下,除非您真的打算调用该特定方法,否则您不会这样做。您应该使用assertarayequals(Object[]expecteds,Object[]actuals)
而不是assertEquals(Object[],Object[])
“已弃用。使用assertarayequals”我猜它是弃用的,因为调用assertEquals太容易了(Object,Object[])
搞错了。谢谢,没有看到那个。可能是重复的