2

我正在为我正在编写的稀疏矩阵类(学校项目的一部分)研究 equals() 方法。我经常遇到这样的问题,它不允许我使用任何方法或特定于我的类的其他成员,因为that(我用于参数 to 的名称equals)必须是泛型类型Object才能覆盖Objectsequals()方法. 除此之外,我还需要能够使用我的 SparseMatrix 类型参数的一些方法来真正比较相等性,除非我也能弄清楚。我怎样才能写它来绕过那个障碍?

我有一些想法,我晚上如何做到这一点,但它们似乎都不起作用:我尝试过转换参数,我尝试过 overlading equals(),我什至尝试过其他一些东西,但似乎都不起作用。

这是我到目前为止所拥有的,但是,正如我所说,我无法让它发挥作用。

public boolean equals(Object that) {
    if (that instanceof SparseMatrix<?>) { 
        if (this.xSize != that.xSize ||
                this.ySize != that.ySize)
            return false;
        /* make some more comparisons that depend on specific
         * members of my matrix class, etc...*/
    }
    return false;
}

我已经尝试过搜索这个,虽然我能够找到一些似乎在问同样事情的人,但我找不到任何真正解释如何做到这一点的答案。

4

2 回答 2

3

当你有一个基类的对象并且你知道它是哪种子类时,你可以通过向下转换来转换它。然后,您可以调用特定于子类的任何方法。

public boolean equals(Object o) {
    if (o instanceof SparseMatrix<?>) { 
        SparseMatrix that = (SparseMatrix)o;  // <-- downcast
        if (this.xSize != that.xSize ||
                this.ySize != that.ySize)
            return false;
    }
    return false;
}

不应该o是 SparseMatrix 的实例或扩展/实现 SparseMatrix 的类(您已经检查过,但假设您没有检查过)您会得到 ClassCastException。

于 2012-09-29T16:34:57.867 回答
2
public boolean equals(Object that) {
    if (that !=null && that instanceof SparseMatrix<?>) { 
        SparseMatrix that = (SparshMatrix)o;
        if (this.xSize != that.xSize ||
                this.ySize != that.ySize)
            return false;
    }
    return false;
}

添加代码以检查null价值。

你需要overrided在你想要实例的类中有这个方法compare。当你实际调用equals那个类的实例时,这个被覆盖的方法将被调用。

**移自评论: -使用instanceof您只能确保您的实例是什么类型,而不是该实例的参数化类型..(您无法确定您是否拥有ArrayList<String>,您可以找到它是ArrayListArrayList<?>准确地说) .. 原因是,generic type信息仅在 可用compile time,并通过 擦除type erasure,因此它们在运行时不可用。

于 2012-09-29T16:38:32.473 回答