2014-12-29 5 views
1

나는 최근에 내 다음 코드에 대한 이상한 컴파일 오류를 건너 왔어요 :instanceof를 던지는 호환되지 않는 유형의

class A { 

} 

class B extends A { 

} 

class Example { 

} 

class Demo { 
    public static void main (String args[]){ 
     B b = new B(); 
     if(b instanceof Example) { 
       System.out.println("Yes it is"); 
     }  
    } 
} 

가 지금은 BExample 호환되지 않는 피연산자을 나타내는 내 조건에 컴파일 오류를 얻고있다. 나는 잠시 동안 검색 한 결과, 오른손 피연산자를 가져 오지 않으면 이클립스 환경에 그러한 오류가 있음을 발견했다. 하지만 제 경우에는 모든 클래스가 같은 파일에 있습니다. 그래서 문제를 파악할 수 없습니다. instanceof은 계층 구조에서만 작동하며 잘못된 예제를 시도한 예입니까?

+1

B와 Example간에 상속 링크가 없습니다. 예외입니다. – Devendra

+2

@Dev 예외가 런타임에 throw됩니다 - 예외는 아니며 컴파일 오류입니다 – Mureinik

+0

예 컴파일러 오류가 발생합니다. – Devendra

답변

3

b을 B로 정의하면이 둘 사이의 상속 관계가 없으므로 절대로 Example이 될 수 없습니다. , 유형이 지정된 인스턴스가 될 수있는 경우 compilier가하고, 확인해야 할 수

class Demo { 
    public static void main (String args[]){ 
     Object o = new Example(); 
     if(o instanceof Example) { 
      System.out.println("Yes it is"); 
     }  
    } 
} 

:

class Demo { 
    public static void main (String args[]){ 
     A a = new B(); 
     if(a instanceof B) { 
      System.out.println("Yes it is"); 
     }  
    } 
} 

을하거나 예를 보유 할 수있는 유형의 주장 경우는 다음과 같습니다 당신은 오히려 할 것 하는 ReferenceType에 RelationalExpression의 캐스트가 컴파일 타임 오류로 거부 될 경우 JLS 15.20.2

를 참조 후, instanceof를 관계식은 마찬가지로생산컴파일 타임 오류. 이러한 상황에서 instanceof 표현 의 결과는 사실 일 수 없습니다.

+0

예, 위의 코드가 작동하지만 참여하는 피연산자가 같은 계층 구조에있을 때만 'instanceof'를 사용해야한다고 엄격하게 정의되어 있습니까? – Sourabh

+1

예, 컴파일러는이를 정적으로 선언 할 수 있고 반드시 선언해야합니다. 나는 대답에 그것을 덧붙였다. – eckes

1

instanceof 연산자는 런타임 유형 검사에 사용됩니다. 예를 들어 A 유형의 참조에 실제로 B 인스턴스가 있는지 확인하는 것이 좋습니다. 그러나 ExampleB은 완전히 분리 된 유형입니다. B에 대한 참조는 이 아니며Example 유형의 인스턴스를 보유하므로 무의미하며 컴파일 할 때 실패 할 수 있습니다.

+0

그럴 것입니다. 내 생각이 잘못되었다고 생각합니다. 필자는 instanceof가 두 개의 관련 유형이 있고 서로 다른 유형이 아닌 경우에만 사용해야한다는 것을 결코 알지 못했습니다. – Sourabh

2

b이 참조하는 개체가 Example의 인스턴스가 될 수있는 방법은 전혀 없습니다. 이것은 컴파일 타임에 알려져 있습니다. Example

class Example {} 

B의 변수 타입 Example의 오브젝트를 참조 할 수있는 방법은 없다 중일

B의 기준이 계층

class B extends A { 

} 

존재한다. 예를 들어 B 유형의 인스턴스는 이미 분명히 Example의 하위 유형이 아닙니다. 또한 B의 하위 유형은 B의 서브 클래스입니다. Java는 다중 상속을 지원하지 않으므로 Example의 하위 유형이 될 수도 없습니다. (Exampleinterface 인 경우에도 마찬가지 임)

+0

Sotirios의 멋진 점이 있습니다. Example을 인터페이스로 만들었을 때 더 이상 오류가 발생하지 않았습니다. – Sourabh

+1

@Sourabh 왜냐하면 당신은'Example'을 구현하는'B'의 서브 클래스를 생성 할 수 있기 때문입니다. 그런 다음 해당 클래스의 인스턴스를 만들어 'b'에 할당 할 수 있습니다. –

+0

그건 나에게 새로운 .... 고마워. :) – Sourabh

1

instanceof은 상속 및 구현의 운영자 전용 작업입니다. 검사 대상이 상속 계층 구조가 아닌 경우 컴파일 오류가 발생합니다.아래에이 작업을 수행하는 코드 여기

class Demo { 
    public static void main (String args[]){ 
     A obj = new B(); 
     if(obj instanceof B) { 
      System.out.println("Yes it is"); 
     }  
    } 
} 

당신이 obj instanceof Example을 확인할 수 없습니다, 계층 구조에서없는 등의 잘못된 것입니다.