Java 为什么JUnit4中的assertEquals(对象[],对象[])不受欢迎?

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

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 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[])
搞错了。谢谢,没有看到那个。可能是重复的