【问题标题】:Casting in java, technical info用java铸造,技术信息
【发布时间】:2012-06-28 20:04:11
【问题描述】:

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

 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) 演员阵容的总体运作方式

有什么建议吗?

【问题讨论】:

  • 这样做的目的/目标是什么?有很多方法可以做你想做的事,但最好的方法取决于你的意图。
  • 那你在问什么?您是否想弄清楚为什么会出现类转换异常?
  • 但是投射肯定不能以这种方式工作。强制转换基于两个类之间的显式 is a 关系,而不是公共属性。

标签: java oop inheritance casting


【解决方案1】:

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

铸造示例

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

【讨论】:

  • 我认为,提问者可能希望 Java 等价于 reinterpret_cast 。 . .幸好不存在。 +1 现场直播。
【解决方案2】:

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

【讨论】:

  • +1 for BeanUtils#copyProperties 这将“解决”他的一个问题。
【解决方案3】:

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找到。

【讨论】:

    【解决方案4】:

    这里最好的解决方案是编写包含两个类的公共元素的超类,然后让每个子类扩展超类,这样你就可以拥有一个 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];}
    

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多