2014-02-22 3 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

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

답변

0

BuildingBarn에서 파생되지 않으므로 ClassCastException이 표시됩니다. 이 예외는 확인되지 않은 다운 캐스트를 수행 할 때마다 가능합니다.

BarnBuilding으로 확장되므로 Barn의 인스턴스를 build1에 할당해야합니다. 문서로

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

클래스 캐스트 예외가 발생 설명 :

코드는이 인스턴스가 아닌 인의 서브 클래스에 객체를 캐스트하려고 한 것을 나타 내기 위해서 (때문에) 슬로우.

두 클래스가 같은 클래스 계층 구조에 있다고해서 그것이 계층 구조의 모든 유형으로 자유롭게 캐스트 할 수 있다는 것을 의미하지는 않습니다. 우리가 다운 캐스트하는 인스턴스는 우리가 다운 캐스팅 한 유형이어야합니다. 인스턴스가 생성 될 때 형식 계층에서 Barn보다 한 수준을 설정하는 형식이 Building이므로 Barn으로 캐스팅 할 수 없습니다.

+0

예 ... 일부 사이트에서는 사람들이 속한 경우 다운 캐스트를 가능하게 만들 수 있다고 설명합니다. 동일한 계층 구조. 가능하다면 ... pls expil 할 수있는 것보다 ... – 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