Java 相等(Obj)测试

Java 相等(Obj)测试,java,Java,我正在测试这两个对象是否相等,但它返回false。有人能给我解释一下为什么会这样吗?谢谢 public boolean equals(Object obj) { if(obj instanceof SparsePolynomial) { return true; } return false; } @Test public void testEqualsObj() { ArrayList<Integer> k = new ArrayList&

我正在测试这两个对象是否相等,但它返回false。有人能给我解释一下为什么会这样吗?谢谢

 public boolean equals(Object obj) {
  if(obj instanceof SparsePolynomial)
  {
   return true;
  }
     return false;
 }

@Test
public void testEqualsObj()
{
    ArrayList<Integer> k = new ArrayList<Integer>();
    k.add(1);
    k.add(3);
    SparsePolynomial d = new SparsePolynomial(k);
    ArrayList<Integer> k2 = new ArrayList<Integer>();
    k.add(1);
    k.add(3);
    SparsePolynomial d2 = new SparsePolynomial(k2);
    Assert.assertTrue(d.equals(d2));
}
公共布尔等于(对象obj){
if(SparsePolynomial的obj实例)
{
返回true;
}
返回false;
}
@试验
public void testEqualsObj()
{
ArrayList k=新的ArrayList();
k、 增加(1);
k、 增加(3);
SparsePolynomial d=新SparsePolynomial(k);
ArrayList k2=新的ArrayList();
k、 增加(1);
k、 增加(3);
SparsePolynomial d2=新SparsePolynomial(k2);
Assert.assertTrue(d等于(d2));
}

试试
Assert.assertTrue(d.equals(d2))

没有足够的信息可以确定,但我怀疑:

  • equals
    未定义为
    SparsePolynomial
    的方法。也许你已经在超类上定义了它。。。或者一个无关的类
  • 更改某些代码后,您尚未重新编译所有相关类
编辑

  • 最好使用
    @Override
    注释来标记希望
    equals
    方法重写(或实现)在超类或接口中定义的方法。(这里不会有任何区别,但它会告诉您是否在方法签名方面犯了错误。)
  • 您对用于测试的Assert方法所做的更改应该不会对结果产生任何影响
  • 你展示的
    等于
    方法显然是假的。它只是测试
    obj
    参数的类型,并忽略其状态。如前所述,每次对一个
    SparsePolynomial
    实例与另一个实例进行测试时,它都应该返回
    true

  • 我试过你的代码,测试通过了

    您可以在这里找到我使用的确切测试用例:

    public class SparsePolynomialTest {
        public static class SparsePolynomial {
            private List<Integer> list;
    
            public SparsePolynomial(List<Integer> list) {
                this.list = list;
            }
    
            public boolean equals(Object obj) {
                if (obj instanceof SparsePolynomial) {
                    return true;
                }
                return false;
            }
        }
    
        @Test
        public void testEqualsSparse() {
            ArrayList<Integer> k = new ArrayList<Integer>();
            k.add(1);
            k.add(3);
            SparsePolynomial d = new SparsePolynomial(k);
            ArrayList<Integer> k2 = new ArrayList<Integer>();
            k2.add(1);
            k2.add(3);
            SparsePolynomial d2 = new SparsePolynomial(k2);
            Assert.assertEquals(true, d.equals(d2));
        }
    }
    
    public class SparsePolynomialTest{
    公共静态类稀疏多项式{
    私人名单;
    公共SPARSEPLYNOMIAL(列表){
    this.list=列表;
    }
    公共布尔等于(对象obj){
    if(SparsePolynomial的obj实例){
    返回true;
    }
    返回false;
    }
    }
    @试验
    public void testequalsparse(){
    ArrayList k=新的ArrayList();
    k、 增加(1);
    k、 增加(3);
    SparsePolynomial d=新SparsePolynomial(k);
    ArrayList k2=新的ArrayList();
    k2.添加(1);
    k2.添加(3);
    SparsePolynomial d2=新SparsePolynomial(k2);
    Assert.assertEquals(真,d等于(d2));
    }
    }
    
    它在这里工作得非常好。你确定你给我们看了所有的东西吗?那是错误的。我更新了它。Java 2出人意料的版本?a) 将
    等于
    注释为
    @override
    。b)
    assertEquals(d,d2)
    可以检查是否相等。不应造成功能差异。使用
    assertEquals
    不应导致测试失败。它将使用
    equals
    来比较两个
    布尔对象。这很难看,但应该有用。我也这么想。问题是遗漏了一些关键的细节。我只是好奇,如果你打算写一些代码并发布,为什么不直接发布到你的答案中呢?下个月这个粘贴箱将不复存在,你的答案要么就没那么有用,要么就没用了。@Monkey:我以为这段代码没有带来任何新东西,它会污染这里的问题页面。因此,我使用了外部资源。顺便说一句,我在pastebin.com上查过“永远保持”或其他什么名字。