2011-01-31 4 views
2

는 내가 변수새 변수를 선언하지 않고 Java에서 객체를 다운 캐스트 할 수 있습니까?

O xyz = new E(); 

하지만 xyz.method()를 호출이라면, 난 단지 클래스 O의 방법이 아닌 E 년대 사람들을 호출 할 수 있습니다를 선언

class O has a child E 

처럼 뭔가를 시도했다 그래서 나는 그것을 버리실 수 있습니다.

E xyz2 = (E) xyz; 

내 질문은 - 새로운 변수를 선언하지 않고 이것을 할 수 있습니까? 같은 뭔가 :

O xyz = new E(); 
xyz = (E) xyz; 

지금은 사용할 수 xyz.method()는 E의 방법

자바에서이 작업을 수행 할 수있는 방법이 있나요

호출? 부모 클래스 (O)가 아니라 방법의 XYZ가 있다면

+0

@Leon은 나중에 (같은 범위에서)'xyz'가'E' 타입이어야한다고 말하면'Oxyz = newE()'라고 쓰지는 않을 것이지만, E xyz = new E()'. 하지만 실제 코드는이 예제보다 더 어렵다고 가정합니다. – Thilo

답변

7

예는 방금이 다형성

0

를 다운 캐스트 할 수 있습니다 변수가 선언 된 후에는 변수의 유형을 변경할 수 없습니다.

당신은 당신이 한 번만 다운 캐스트해야하는 경우 일부 입력을 저장하는 타입 변환을, 인라인 수 있습니다 : 당신이 한 번 이상 그렇게 할 필요가 있다면 당신은 아마하지만, 새로운 변수를 생성해야

Number n = 1; 
((Integer)n).someIntegerMethod(); 

. 컴파일러는 그렇지 않으면 제대로 최적화 할만큼 충분히 똑똑 할 수도 있고 그렇지 않을 수도 있습니다 (반복 클래스 캐스팅의 런타임 오버 헤드가 발생합니다).

+0

그러나 그는 그렇지 않다. 서브 클래스에만 그가 호출하기를 원하는 메소드가 있습니다. – Thilo

+1

그러면 그는 단지 E xyz = new E()를 선언하거나 O에서 추상 메소드 xyz를 작성해야합니다.이 질문에 대한 태그는 다형성이며 이것은 다형성 행동이 될 것입니다 – Leon

+1

(실제로 필요한 유형의 변수를 선언하는 것)이 최선의 방법 일 것입니다. 나는 이것이 단순한 예라고 가정하고있다. – Thilo

0

없음입니다

O xyz = new E(); 
xyz.method(); // E's xyz would be called 

부를 수있는,

((E)xyz).method(); 
0

이처럼 수행 할 수 없습니다

O xyz = new E(); 
xyz = (E) xyz; 
xyx.someEMethod(); // compilation error 

이유는 자바 객체의 타입 변환이 실제로 어떤 값을 변경하지 않는 것이 있습니다. 오히려 객체의 실제 유형에 대해 유형 검사를 수행합니다.

코드는 xyz의 값이 E임을 확인, 그러나 이에 다시 되돌려 O에 그것을 upcasting 다시 xyz (제 문)의 배역의 결과를 할당한다.

그러나이를 수행 할 수 있습니다 때문에 배역 주위

((E) xyx).someEMethod(); // fine 

괄호는 필수적이다 '.' 연산자는 유형 변환보다 우선 순위가 높습니다.

관련 문제