scjp:类转换规则集

时间:2014-02-22 11:34:06

标签: java class casting scjp

如果子类属于同一层次结构,我们可以向下抛出超类吗?

示例:

class Building { }
 public class Barn extends Building {
 public static void main(String[] args) {
 Building build1 = new Building();
 Barn barn1 = new Barn();
 //Barn barn2 = (Barn) build1; // line number 10
 Object obj1 = (Object) build1;
 //String str1 = (String) build1; // line number 12
 Building build2 = (Building) barn1;
 }
 }

这里的答案表明,只有第12行注释才能编译代码。但是,即使第10行被评论,代码也会被编译。请帮忙。

2 个答案:

答案 0 :(得分:0)

由于Building不是来自Barn,您将收到ClassCastException。您可以在执行未经检查的向下转发时随时执行此例外。

由于Barn扩展Building,您需要将Barn的实例分配给build1

 Building build1 = new Barn();
 Barn barn2 = (Barn) build1;

正如文档解释的那样抛出了类强制转换异常:

  

抛出以指示代码已尝试将对象强制转换为   它不是实例的子类。

仅仅因为两个类在同一个类层次结构中并不意味着我们可以自由地向下转换为层次结构中的任何类型。我们正在转发的实例必须是我们正在向下转型的类型。由于创建的实例属于Building类型,在类型层次结构中将{1}设置为Barn以上,因此无法将其转换为Barn

答案 1 :(得分:0)

请参阅以下示例

class SuperClass {
...
}

class SubClass extends SuperClass {
...

}

public class Program {
  public static void main(String[] args) {

// case 1: actual SuperClass object
    SuperClass p1 = new SuperClass(); 

// case 2: SubClass object is referred by a SuperClass reference 
    SuperClass p2 = new SubClass();   

    SubClass s1 = (SubClass)p1; //run time error
    SubClass s2 = (SubClass)p2; //OK
  }
}

谢谢你祝你好运