为什么在冗余的情况下采用相同的方法?

时间:2017-08-27 11:21:21

标签: java casting

所以这是单元测试的一部分:

public class LocationTester {

private Floor seventhFloor;
private int size = 10;

@Before
public void setup() {
    size = 10;
    seventhFloor = new Floor(7, size);
}

@Test
public void testLocationEquality() {
    Location l1 = new Location(seventhFloor, 3, 3);
    Location l2 = new Location(new Floor(7, size), 3, 3);
    assertTrue(l1.equals(l2));
}}

这是Location类的一部分,方法等于:

class Location {

private Floor floor;
private int size, position;

    @Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (obj == this) {
        return true;
    }
    if (obj instanceof Location) {
        return false;
    }
    return equals((Location) obj);
}

public boolean equals(Location loc) {
    return floor.equals(loc.floor) && position == loc.position && size == loc.size;
}

这是Floor class的一部分:

class Floor {

private int number;

    public boolean equals(Floor floor) {
    return number == floor.number;
}

我不知道为什么在“位置l2 =新位置(新楼层(7,大小),3,3)”的“新位置”时,为什么使用参数(对象obj)和类型转换等于方法;“实际上是Location本身的对象。为什么需要放置equals(Object obj)。

测试运行正常,方法不等于(Object obj)。

更不用说,这个项目中没有Location的子类。那么为什么要将类型转换为“return equals((Location)obj”;“呢?

1 个答案:

答案 0 :(得分:1)

您的测试实际上只测试equals(Location)方法。它没有测试equals(Object)方法。

但是,equals(Object)存在于类中,以覆盖Object.equals(Object)中的Object,这要求参数 any Location

如果在某些程序中,您将Object对象分配给Object a = new Location(...); Object b = new Location(...); 变量:

a.equals(b)

然后您使用false,它不会使用位置相等测试,并且将始终返回equals(Object),即使这两个实例指定相同的位置 - 除非你有一个合适的equals(Object)方法 - 这就是你所拥有的。

在那个Object方法中,因为它的参数是Location类型,如果不将它强制转换为equals(Location),它将永远递归调用自身。你必须强制转换它才能最终调用包含实际相等测试的equals(Location)方法。

实际上你可以不用equals(Object)而只是在Location中编写测试,但我想作者想要在编译时知道的情况下保存三个测试步骤时间被测对象是public int pop() { int res = data[0]; ... return res; }