【问题标题】:Java downcasting and is-A has-A relationshipJava 向下转型和 is-A has-A 关系
【发布时间】:2011-02-19 06:00:40
【问题描述】:

嗨,

我有一个向下铸造的问题,我在这方面有点生疏。 我有 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);

因此,即使上述方法返回 A,我也尝试将其向下转换为 B,但我得到了运行时 ClassCastException。 真的没有办法解决这个问题吗?我是否必须编写一个单独的 converts() 方法来返回 B 类类型?

如果我像这样声明我的 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) );

这样我可以重用现有的方法,即使扩展关系更有意义。我该怎么办?非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: java downcast


    【解决方案1】:

    如果您的 converts() 方法实际上没有返回 B,则无法将其强制转换为 B。由于您收到 ClassCastException,它显然不会返回 B。

    您当然可以编写一个返回 B 的 converts(C c)。但另一种方法可能是编写一个构造函数:

    B(A a)
    

    它根据 A 的内容创建一个 B。然后你使用转换来获取一个 C,并从中创建一个 B。

    【讨论】:

      【解决方案2】:

      A 类型到B 类型的转换:

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

      不起作用,因为A 类型的对象没有可能从B 类型的引用中调用的所有方法。如果你打电话给

      ,你会期望发生什么
      bClasss.getK();
      

      在下一行?底层对象没有成员变量k,因此不允许这种转换。

      您可以在类层次结构中使用 higher 类型的引用来引用 lower 类型的对象,但反之则不行。

      在不了解的情况下,我认为最好的办法是实现多种方法

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

      如果 B 扩展了 A,那么您仍然应该从类的构造函数中的一些代码重用中受益。

      【讨论】:

        【解决方案3】:

        您应该在适当的抽象级别上工作,并编写您的方法签名来做同样的事情。如果 B 的公共/默认接口从 A 被大量修改,那么您的方法签名确实应该返回 B。否则,放弃尝试强制转换它,将 .converts 的结果分配给 A 类型的变量,然后处理它就像一个 A,即使它的真实类型实际上是一个 B。如果你试图在这里低调,你就会打败通过继承进行抽象的点。

        没有看到您的源代码,我不知道在这里使用组合代替继承是否有意义。以上段落假设您所说的“扩展关系更有意义”是真的。

        【讨论】:

          【解决方案4】:

          这里重要的是 Utility.converts() 实际返回的内容 - 如果它不创建新的 B 对象并返回它,则无法从中获取 B。

          (因为你得到 ClassCastException,所以它不会在里面创建 B)

          【讨论】:

          • 谢谢 Yoni,我已经声明了上面的方法 converts 如下: public static A converts(C c){} 所以它确实返回 A。我想知道这个问题是否没有其他方法,其他而不是将关系从 is-a 更改为 has-a 或编写其他方法?
          • 不是converts()的声明有问题,是converts()的实现有问题(它是做什么的?)
          猜你喜欢
          • 2021-11-02
          • 2016-07-09
          • 2016-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-14
          相关资源
          最近更新 更多