在java中投射,技术信息

时间:2012-06-28 20:04:12

标签: java oop inheritance casting

我正在尝试理解当某人将某个特定类的对象转换为另一个类时发生的事情。我有两个班级

 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。

问题是我有两个类,每个类只包含两个属性,但每个都包含它们。这些属性中有16个在两个类中都很常见。

此外,returneddata方法返回从存储库中检索的对象。你可以理解我想找到一种方法并将对象Aclass的16个数据属性传递给对象Bclass。

我想:

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

2)演员如何正常运作

任何提议?

4 个答案:

答案 0 :(得分:8)

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

一个演员示例

假设我们有一个对象Fruit fruit = new Banana();。现在,如果您需要在代码中稍后调用Banana方法,则可以使用强制转换fruit投射(Banana)。为什么?因为您碰巧知道fruitBanana但Java编译器不知道(它认为它是Fruit,它也可能是一个不同的结果)。因此,您必须添加强制转换以添加有关fruit的其他信息并安全地执行操作。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

Java类和接口根据extendsimplements关键字定义的关系形成DAG。

如果A extends BA implements B,那么B是A的直接超类或超接口。
如果A是B的直接超类/接口,B同样是C,那么A是C的间接超类/接口。
java.lang.Object类是每个类的超类。

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

某些构造(数组,基本类型)也有一些特殊规则,但上述规则应该清楚说明为什么你的演员表不起作用。

可以找到完整的说明here

答案 3 :(得分: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];}