0

我试图了解当有人将一个特定类的对象投射到另一个类时会发生什么。即有两个类

 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。

问题是我有两个类,每个类不只包含两个属性,而是包含两个属性 20。这些属性中的 16 个在两个类中都很常见。

此外,returneddata 方法返回从存储库中检索到的对象。如您所见,我想找到一种方法并将对象 Aclass 的 16 个数据属性传输到对象 Bclass。

我想:

1)找到一种方法将16个公共属性数据从一个对象重写到另一个对象

2) 演员的总体工作方式

有什么提议吗?

4

4 回答 4

8

这两个类具有相似的属性这一事实并不重要。重要的是它们Aclass彼此Bclass无关:一个不是另一个的超类。如果您想在这些类之间共享或移动数据,您需要自己将数据从一个实例复制到另一个实例。

铸造示例

假设我们有一个对象Fruit fruit = new Banana();。现在,如果您需要Banana在代码中调用稍后的方法,您可以fruit使用 cast 进行转换(Banana)。为什么?因为您碰巧知道这fruit是 aBanana但 Java 编译器不知道(它认为它是 aFruit并且它也可能是不同的水果)。因此,您必须添加演员表以添加有关的附加信息fruit并安全地执行操作。

于 2012-06-28T20:08:00.830 回答
2

两个类 Aclass 和 Bclass 没有公共的超类或接口,因此 ClassCastException。在这种特殊情况下,您可以使用 BeanUtils,http: //commons.apache.org/beanutils/,将公共属性从 Aclass 复制到 Bclass。

于 2012-06-28T20:12:04.630 回答
2

Java 类和接口基于它们由extendsorimplements关键字定义的关系形成一个 DAG。

如果A extends BA implements B,则 B 是 A 的直接超类或超接口。
如果 A 是 B 的直接超类/接口且 B 与 C 类似,则 A 是 C 的间接超类/接口。
java.lang.Object是每个类的超类.

如果 B 是 A 的超类/接口(或者当 A 和 B 是同一个类),则 A 类的对象只能转换为 B。

对于某些构造(数组、原始类型)也有一些特殊规则,但上述规则应该清楚地说明为什么您的演员表不起作用。

完整的描述可以在这里找到。

于 2012-06-28T20:16:58.223 回答
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 回答