我在学校学习了一年的java课程,对铸造的理解非常有限。
我理解的转换类型是将int转换为double。这是有道理的; 1将成为1.0
我不太了解的铸造类型是:
将自定义对象(比如superRectangle
)转换为另一个客户对象(例如myRectangle
)。 (假设myRectangle
是superRectangle
的子类)
与superRectangle
实例关联的所有私有或公共字段会发生什么?该计划如何知道这是一个合法的举动?对于所有重要的事情,我只能将一个int转换成一个字符串,那究竟是什么意思呢?
答案 0 :(得分:6)
严格来说,从int
到double
不是投射,而是转化。转换是关于将内存中相同的,未更改的位模式重新解释为属于另一种类型。这正是Java中的转换引用类型归结为:你有一个明确的,不可更改类型的对象,而你只是看起来就好像它是一个超类型的实例。
您将不被允许将Integer
投射到String
,因为后者不是前者的超类型。这在编译时得到了保证,并且在运行时也进行了双重检查。
答案 1 :(得分:2)
类层次结构,如果它们位于同一层次结构中,那么在编译时不会出现转换问题。
Integer
和Double
是兄弟姐妹,而不是在同一层次结构中,因此您可以'说
Double d = (Double)(new Integer(4));// compile time error
每个子类也都知道它的超类。
答案 2 :(得分:1)
只有当" superRectangle"是一个" myRectangle"刚刚被引用为superRectangle。如果不是,您将在运行时获得转换异常。
如果我们假设MyRectangle
和YourRectangle
都延伸SuperRectangle
...
此代码可以使用:
SuperRectangle superRect = new MyRectangle();
MyRectangle castedMyRect = (MyRectangle)superRect;
此代码将抛出ClassCastException
:
SuperRectangle superRect = new MyRectangle();
YourRectangle castedYourRect = (YourRectangle)superRect;