我正在编写我正在编写的稀疏矩阵类的equals()方法(学校项目的一部分)。我经常遇到这样的问题:它不会让我使用任何特定于我的类的方法或其他成员,因为that
(我用于equals
的参数的名称)必须是通用类型Object
,以覆盖Objects
的{{1}}方法。除此之外,我需要能够使用我的SparseMatrix类型参数的一些方法来真正比较相等,除非我也能算出来。我怎么写它来绕过这个障碍?
我有一些想法,我晚上做了什么,但它们似乎都没有工作:我已经尝试了参数,我尝试重叠equals()
,我甚至尝试过其他一些东西,但是似乎没有任何效果。
这是我到目前为止所做的,但正如我所说,我无法让它发挥作用。
equals()
我已经尝试过搜索SO了,虽然我能找到一些似乎在问同样的东西,但我找不到任何实际解释如何来做到这一点的答案
答案 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>
,您可以找到的是ArrayList
或ArrayList<?>
是准确的。)原因是,generic type
信息仅在{{{ 1}},并通过compile time
删除,因此它们在运行时不可用..