0

誰かが特定のクラスのオブジェクトを別のクラスにキャストするとどうなるかを理解しようとしています。つまり、2つのクラスがあります

 public class Aclass{

   private String attribute1;

   private List<String> attribute2;

   //get/set methods

 }

 public class Bclass{

   private String attribute1;

   private List<int> attribute2;

   //get/set methods

 }

現在、別のクラス内にこれらのオブジェクトの両方があり、その後それらをキャストします。

public class Cclass{

   Aclass aclass=new Aclass();

   //returneddata is a method that returns an Aclass object that contained dta for the Aclass attributes
   aclass=returneddata();

   Bclass bclass=new Bclass();


   bclass=Bclass.class.cast(aclass);

}

前述のクラスから、java.lang.ClassCastException を取得しています。

問題は、それぞれ 2 つの属性のみを含むのではなく、両方の属性を含む 2 つのクラスがあることです。これらの 16 の属性は、両方のクラスで共通です。

さらに、returneddata メソッドは、リポジトリから取得したオブジェクトを返します。理解できるように、方法を見つけて、オブジェクト Aclass の 16 個のデータ属性をオブジェクト Bclass に転送したいと考えています。

私が欲しい:

1) あるオブジェクトから別のオブジェクトに 16 の共通属性データを書き換える方法を見つけること

2) キャストの全体的な働き方

提案はありますか?

4

4 に答える 4

8

両方のクラスが同様の属性を持っているという事実は重要ではありません。重要なのは、AclassBclassが互いに関連していないことです。一方は他方のスーパークラスではありません。これらのクラス間でデータを共有または移動する場合は、あるインスタンスから別のインスタンスに自分でデータをコピーする必要があります。

鋳造例

object があるとしましょうFruit fruit = new Banana();Bananaコードの後半で のメソッドを呼び出す必要がある場合はfruit、 cast でキャストできます(Banana)。なんで?たまたまそれが であることfruitはわかってBananaいますが、Java コンパイラーはそれを認識していないためです (Java コンパイラーは、それが であると考えておりFruit、別の果物である可能性もあります)。そのため、キャストを追加して追加情報を追加しfruit、操作を安全に実行する必要があります。

于 2012-06-28T20:08:00.830 に答える
2

ここでの最善の解決策は、両方のクラスの共通要素を含むスーパー クラスを作成し、各サブクラスにスーパー クラスを拡張させることです。これにより、タイプ SuperClass のリストを作成できます。

public class SuperClass{
   protected String att1_common;
   protected List<String> att2_common;
}

import SuperClass
public class Aclass extends SuperClass {
   private String uniqueAtt1; 
   //get/set methods
}

import SuperClass
public class Bclass extends superClass{
   private String uniqueAtt1;
   //get/set methods
}

保護されたスコープ修飾子に注意してください。これは、サブクラスを除いてプライベートであることを意味します

だから今:

List<SuperClass> listofstuff;
try{ Aclass item = listofstuff[0];}
catch( java.lang.ClassCastException e){try Bclass item = listofstuff[0];}
于 2012-06-28T20:19:55.950 に答える
2

Aclass と Bclass の 2 つのクラスには、共通のスーパー クラスまたはインターフェイスがないため、ClassCastException が発生します。この特定のケースでは、BeanUtils ( http://commons.apache.org/beanutils/ ) を使用して、共通プロパティを Aclass から Bclass にコピーできます。

于 2012-06-28T20:12:04.630 に答える
2

extendsJava クラスとインターフェースは、またはimplementsキーワードで定義された関係に基づいて DAG を形成します。

A extends Bまたはの場合A implements B、B は A の直接スーパークラスまたは
スーパーインターフェースです。A が B の直接スーパークラス/インターフェースであり、B が C と同様である場合、A は C の間接スーパークラス/インターフェースです。
クラスjava.lang.Objectはすべてのクラスのスーパークラスです。 .

クラス A のオブジェクトは、B が A のスーパークラス/インターフェースである場合 (または A と B が同じクラスである場合) にのみ B にキャストできます。

特定の構造 (配列、プリミティブ型) にはいくつかの特別な規則もありますが、上記の規則により、キャストが機能しない理由が明確になります。

完全な説明はここにあります。

于 2012-06-28T20:16:58.223 に答える