2014-02-22 54 views
0

如果子类属于相同的层次结构,我们是否可以向下投射超类?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行被注释了,代码也只能被编译。请帮忙。

+1

为什么会注释行'10'使代码编译失败? –

+0

除了@RohitJain说你在第10行铸造完全没问题。 –

+0

检查http://stackoverflow.com/questions/4862960/explicit-casting-from-super-class-to-subclass – Rohan

回答

0

由于Building不是从Barn派生的,您将收到ClassCastException。这个例外是可能的,你可以在任何时候执行一个未经检查的downcast。

由于Barn延伸Building您需要将Barn的实例分配到build1

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

由于文档解释了一个类转换异常被抛出:

抛出,表明代码试图将对象强制转换为 子类,它是不是一个实例。

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

+0

是的......但在一些网站上,人们正在解释说,如果属于相同的等级。这是可能的...如果是这样,你可以请求扩展... – user3066920

+0

@ user3066920是的,这是完全可能的,但是一个向下转换,将一个超类的实例投射到一个子类。如果实例是子类型的** NOT **,那么这是非法的。 –

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 
    } 
} 

谢谢你好运

+0

感谢您的支持 – user3066920

+0

欢迎您---> user3066920 – T8Z