【问题标题】:Can Java cast anything?Java可以转换任何东西吗?
【发布时间】:2014-05-16 19:57:27
【问题描述】:

我在学校学习了一年的 Java 课程,但我对强制转换的理解非常有限。

我理解的转换类型是将 int 转换为 double。这是有道理的; 1 会变成 1.0

我不太了解的投射类型是: 将自定义对象(例如superRectangle)转换为另一个客户对象(例如,myRectangle)。 (这是假设myRectanglesuperRectangle 的子类) 与superRectangle 实例关联的所有私有或公共字段会发生什么情况?程序怎么知道这是一个合法的举动?对于所有这些问题,我可以将一个 int 转换为一个字符串,这到底是什么意思?

【问题讨论】:

  • 什么时候需要演员表?在函数的参数中,您可以尝试 Java 泛型
  • 要记住对象真正是一回事,而且永远不会改变。例如洗车需要Car 并清洗它(它将你的Honda 投射到Car 并清洗它)但它只是“从那个角度看它”,它实际上仍然是一个Honda .如果它试图将那辆车转换为Ford,你会得到一个运行时异常,因为它实际上是一个Honda
  • 在你的程序中,偶然铸造和它的表亲instanceof 应该很少见。通常有更好的方法来做到这一点

标签: java object casting subclass


【解决方案1】:

严格来说,从intdouble 不是转换,而是转换。强制转换是将内存中相同的、未更改的位模式重新解释为属于另一种类型。这正是 Java 中的引用类型转换归结为:您有一个确定的、不可更改类型的对象,而您只是查看它,就好像它是其超类型之一的实例。

您不能将Integer 转换为String,因为后者不是前者的超类型。这在编译时得到保证,并在运行时进行双重检查。

【讨论】:

    【解决方案2】:

    类层次结构知道,如果它们在同一个层次结构中,那么编译时的转换就没有问题。

    IntegerDouble兄弟姐妹,并且不在同一个层次结构中,所以你可以说

    Double d = (Double)(new Integer(4));// compile time error
    

    每个子类也都知道它的超类。

    阅读更多关于OOP: Class Hierarchy

    【讨论】:

      【解决方案3】:

      只有当“superRectangle”是一个“myRectangle”当前被引用为一个 superRectangle 时,转换才有效。如果不是,您将在运行时收到强制转换异常。

      如果我们假设 MyRectangleYourRectangle 都扩展 SuperRectangle...

      此代码将起作用:

      SuperRectangle superRect = new MyRectangle();
      MyRectangle castedMyRect = (MyRectangle)superRect;
      

      这段代码会抛出ClassCastException:

      SuperRectangle superRect = new MyRectangle();
      YourRectangle castedYourRect = (YourRectangle)superRect;
      

      【讨论】:

        猜你喜欢
        • 2019-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        • 2011-09-17
        相关资源
        最近更新 更多