0

こんにちは、

ダウンキャスティングの質問があります。この分野では少し錆びています。私はこのような2つのクラスを持っています:

class A{ int i; String j ; //Getters and setters}
class B extends A{ String k; //getter and setter}

ユーティリティヘルパークラスに、次のようなメソッドがあります。

public static A converts(C c){}

ここで、Cは、データベースから削除されてから変換されるオブジェクトです。

問題は、「C」を渡してBを取得することにより、上記のメソッドを呼び出したいということです。そこで、これを試しました。

B bClasss = (B) Utility.converts(c);

したがって、上記のメソッドはAIを返しますが、それをBにダウンキャストしようとしましたが、ランタイムClassCastExceptionが発生します。これを回避する方法は本当にありませんか?Bクラス型を返す別のconverts()メソッドを作成する必要がありますか?

クラスBを次のように宣言した場合:

class B { String k; A a;} // So instead of extending A it has-a A, getter and setters also

次に、次のように既存のメソッドを呼び出すことができます。

b.setA(Utility.converts(c) );

このようにして、extends関係の方が理にかなっている場合でも、既存のメソッドを再利用できます。私は何をすべきか?どんな助けでも大歓迎です。ありがとう。

4

4 に答える 4

4

AタイプからタイプへのキャストB

B bClasss = (B) Utility.converts(c);

タイプのオブジェクトには、タイプAの参照から呼び出される可能性のあるすべてのメソッドがないため、は機能しませんB。電話をかけたらどうなると思いますか

bClasss.getK();

次の行に?基になるオブジェクトにはメンバー変数がないkため、このキャストは許可されていません。

クラス階層内の上位タイプの参照を使用して、下位タイプのオブジェクトを参照できますが、その逆はできません。

詳細を知らなくても、複数のメソッドを実装するのが最善だと思います

A aObj = Utility.convertToA(c);
B bObj = Utility.convertToB(c);

Bextendsの場合Aでも、クラスのコンストラクターでコードを再利用することでメリットが得られるはずです。

于 2010-05-13T19:31:18.910 に答える
2

ここで重要なのは、Utility.converts()が実際に返すものです。新しいBオブジェクトを作成して返さない場合、そこからBを取得する方法はありません。

(ClassCastExceptionが発生しているため、内部にBは作成されません)

于 2010-05-13T19:14:43.383 に答える
1

適切なレベルの抽象化で作業し、同じことを行うためにメソッドシグネチャを作成する必要があります。Bのパブリック/デフォルトインターフェイスがAから大幅に変更されている場合、メソッドシグネチャは実際にBを返す必要があります。それ以外の場合は、それをキャストしようとする溝、.convertsの結果をタイプAの変数に割り当て、処理します。本当のタイプは実際にはBですが、Aのようになります。ここでダウンキャストしようとすると、継承による抽象化のポイントを打ち負かすことになります。

あなたのソースコードを見ていないと、ここで継承の代わりに合成を使用することが理にかなっているのかどうかわかりません。上記の段落は、「関係を拡張する方が理にかなっている」というあなたの言うことが本当に真実であると仮定しています。

于 2010-05-13T19:23:40.560 に答える
0

convert()メソッドが実際にBを返さない場合、それをBにキャストする方法はありません。ClassCastExceptionを取得しているため、明らかにBを返しません。

もちろん、Bを返すconverts(C c)を作成することもできます。ただし、別のアプローチとして、コンストラクターを作成することもできます。

B(A a)

これは、Aの内容に基づいてBを作成します。次に、convertsを使用してCを取得し、そこからBを作成します。

于 2010-05-13T19:33:52.540 に答える