2017-11-14 2 views
1

간단한 캐스팅 예제를 사용하는 데 어려움이 있습니다. 저 좀 도와 주 시겠어요?딜레이마 캐스팅 인터페이스

public class Example1 { 

interface ParentIf{} 
interface ChildIf extends ParentIf {} 
interface OtherIf {} 

class ParentCl {} 
class ChildCl extends ParentCl {} 
class OtherCl {} 

    public static void main(String[] args) { 
     ChildIf cI = null; 
     ParentIf pI = null; 
     OtherIf oI = null; 
     ChildCl cC = null; 
     ParentCl pC = null; 
     OtherCl oC = null; 

     cI = (ChildIf)oI; //case1 - fine 

     cC = (ChildCl)oC; //case2 - inconvertible types 

     cI = (ChildIf)oC; //case3 - fine 
    } 
} 

하지만 더 어색한 점은 왜 다른 두 문장이 괜찮은지 모르겠다는 것입니다.

OtherIf와 ChildIf 사이의 연결이 표시되지 않습니다. 그렇다면 CaseI의 두 인터페이스 사이에 "확장"이 없을 때 ChildIf에 OtherIf를 캐스팅하는 것이 어떻게 가능합니까? oI이 ChildIf 및 OtherIf 모두를 구현하는 클래스의 인스턴스가 될 수 있기 때문에

답변

2
cI = (ChildIf)oI; 

괜찮습니다. oCOtherClass anec가 ChildIf를 구현 확장하는 클래스의 인스턴스가 될 수 있기 때문에

cI = (ChildIf)oC; 

괜찮습니다.

+0

나는 아직도 조금 혼란 스럽다. "할 수있다"는 의미는이 순간에 나는 ChildIf와 OtherIf를 모두 구현하는 클래스의 인스턴스가 아니라 IntelliJ가 될 수 있음을 "안다"는 것을 의미합니다. 미안 내가 그것을 볼 수 없습니다 :/ – vviston

+1

oI는 'OtherIf' 유형의 객체를 참조하는 변수입니다. 컴파일러는 런타임에 객체의 구체적인 유형을 신경 쓰지 않습니다. 그것은 선언 된 변수의 타입 인 OtherIf에 관심을가집니다. 유형이 ChildIf 및 OtherIf를 모두 구현할 수 있습니까? 예, 가능합니다. 따라서 캐스트가 성공할 수도 있으므로 의미가 있습니다. –

관련 문제