1

入力として受け取るデータ型 X を使用して HashMap を構築するライブラリがあります。JGraphT ライブラリです。今、私は X の 2 つのタイプ、Y と Z を持っています。つまり、X はスーパー クラスです。Y と Z は X のサブクラスです。X は頂点です。Y と Z は特定の種類の頂点です。

ここで、JGraphT でグラフを作成し、グラフ内の任意のエッジのソース頂点を取得すると、データ型 X として取得します。それをデータ型 Y および Z に変換したいのですが、単純な括弧で囲まれた型変換は機能しません。スーパークラス オブジェクトからサブクラス オブジェクトにそのように変換できないことは理解しています。しかし、これを達成する方法はありますか?

4

4 に答える 4

0

データ型 Y と Z に変換したいのですが、単純な括弧付きの型変換ではうまくいきません。

おそらく「単純な括弧付き型変換」とは、次のようなことを意味します。

X myX = ...
Y myY = (Y) myX;

それは「タイプキャスト」と呼ばれます。

myXが本当に のインスタンスである場合はY、それを に割り当てますmyY」と表示されます。を参照するオブジェクトがのインスタンスでない場合、型キャストは (実行時例外1で) 失敗します。myXY

スーパークラス オブジェクトからサブクラス オブジェクトにそのように変換できないことは理解しています。

「変換」が上記のタイプキャストとは異なることを意味している場合、それは正しいです。

しかし、これを達成する方法はありますか?

オブジェクトを実際の型または実際の型のスーパータイプとは異なる型に「変換」する一般的な方法はありません。このような「変換」は、タスクを実行するための何らかのメソッドを記述することによってのみ行うことができ、必然的に別個の新しいオブジェクトを作成する必要があります。これが賢明かどうか (または可能かどうか) は、アプリケーションによって異なります。

(たとえば、インスタンスがグラフ内のノードを表す場合、新しいオブジェクトを作成する「変換」により、グラフの他のノードが参照していないものが得られます。これは、何かを壊す可能性があります。)


1 -instanceofテストを使用して例外を防ぐことができますが、オブジェクトをメンバーではない型に型キャストすることはできません。

于 2013-06-25T01:32:18.487 に答える
0

これを解決する 1 つの方法は、静的メソッドを Y と Z に追加して、必要な処理を行うことです。

    class Y extends X {
    ...
            public static Y toYType(X original) {
                ....
            }
    ...
    }

とにかく、同じオブジェクトをサブクラスに「変換」することはできません。これについて考えてみてください。Y は X の特殊な型であり、追加のフィールドが含まれている可能性があります。X を Y に「変換」できる場合、この余分なフィールドをどのように埋める必要がありますか? 新しいオブジェクト Y を明示的に作成する必要があります

于 2013-06-25T01:36:02.960 に答える