日期:2014-05-20  浏览次数:20705 次

SCJP 求助:强制转换
Question 22
Given

Java code

5.  class Building{}
6.  public class Barn extends Building{
7.    public static void main(String[] args){
8.        Building build1 = new Building();
9.        Barn barn1 = new Barn();
10.        Barn barn2 = (Barn)build1;
11.        Object obj1 = (Object)build1;
12.        String str1 = (String)build1;
13.        Building build2 = (Building)barn1;
14.     }
15. }



Which is true?
A If line 10 is removed, the compilation succeeds.
B If line 11 is removed, the compilation succeeds.
C If line 12 is removed, the compilation succeeds.
D If line 13 is removed, the compilation succeeds.
E More than one line must be removed for compilation to succeed.

12行有问题这个比较明显。
第10行编译可以通过,但是run时却报
Exception in thread "main" java.lang.ClassCastException: Building cannot be cast to Barn
  at Barn.main(Barn.java:10)
我觉得第10行在编译时应该也不能通过,请问这是问什么呢?
为什麽String可以compile时报错,另外自己定义的类就不行?
是因为编译时无法识别Building强制转换到Barn是向下转换吗?
非常感谢。

------解决方案--------------------
向下转型是可以的
实际应用中也是比较常见的
最常见的就是将Object强转为实际的类型
e.g User user=(User)session.getAttribute("session_user");
但是严格来说,在进行向下转换的时候一定进行检查
User user = null;
if(object.getClass()==User.class){
 user =(User)object;
}
------解决方案--------------------
我来回答你的问题:
首先,第10句是把父类的对象转换为子类对象,这是不允许的,因为在子类中可能实体变量多于父类中的....只能用父类的对象引用子类的实体。
其次,类型转换属于运行时异常,这个并不用你自己捕捉,java在运行时其虚拟机会自动抛出异常。