在ny equals()方法中调用泛型类型的特定方法

时间:2012-09-29 16:32:37

标签: java casting polymorphism equals

我正在编写我正在编写的稀疏矩阵类的equals()方法(学校项目的一部分)。我经常遇到这样的问题:它不会让我使用任何特定于我的类的方法或其他成员,因为that(我用于equals的参数的名称)必须是通用类型Object,以覆盖Objects的{​​{1}}方法。除此之外,我需要能够使用我的SparseMatrix类型参数的一些方法来真正比较相等,除非我也能算出来。我怎么写它来绕过这个障碍?

我有一些想法,我晚上做了什么,但它们似乎都没有工作:我已经尝试了参数,我尝试重叠equals(),我甚至尝试过其他一些东西,但是似乎没有任何效果。

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

equals()

我已经尝试过搜索SO了,虽然我能找到一些似乎在问同样的东西,但我找不到任何实际解释如何来做到这一点的答案

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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信息仅在{{{ 1}},并通过compile time删除,因此它们在运行时不可用..