2

私が書いている疎行列クラスの equals() メソッドに取り組んでいます (学校のプロジェクトの一部)。のメソッドをオーバーライドするにthatは、(パラメーターに使用した名前equals) がジェネリック型でなければならないため、クラスに固有のメソッドや他のメンバーを使用できないという問題に常に直面しています。 . さらに、SparseMatrix の型パラメーターのいくつかのメソッドを使用して、等価性を実際に比較できるようにする必要があります。その障害を回避するためにどのように書くことができますか?ObjectObjectsequals()

私は夜にそれを行う方法をいくつか考えていますが、どれも機能していないようです: パラメータをキャストしてみ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;
}

これについてSOを検索してみましたが、同じことを尋ねているように見えるものをいくつか見つけることができましたが、実際にその方法を説明する答えを見つけることができませんでした.

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;
}

SparseMatrixoのインスタンス、または 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 typecompile timetype erasure

于 2012-09-29T16:38:32.473 に答える