2013-04-07 3 views
3

instanceof을 사용하여 사용자 정의 인터페이스에 대해 사용자 정의 클래스를 테스트 할 수 있으며 Java 핵심 클래스와 동일한 작업을 수행 할 수없는 이유는 무엇입니까?customof/core 클래스가있는 instanceof

interface A{} 
class B{} 
public class Tmp { 
    public static void main(String [] args) { 
     String s = ""; 
     Integer i = 1; 
     B b = new B(); 
     System.out.println(s instanceof A); //1 
     System.out.println(i instanceof A); //2 
     System.out.println(b instanceof A); //3 
    } 
} 

줄 1과 2는 컴파일되지 않습니다. 3 행은 컴파일되고 (false을 인쇄하십시오.) 차이점이 뭐야?

+0

[this] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html) 기사를 읽으셨습니까? – Bernard

+0

@Bernard, 예, 읽었습니다. 그것은 내 질문에 대답하지 않았다. –

답변

4

컴파일러가 instanceof 연산이 사실 일 수 없다는 것을 감지하면 컴파일러 오류가 발생합니다. 그것은 캐스팅과 같은 규칙을 따라 이것을 결정합니다. 특정 규칙은 JLS의 Section 15.20.2에 설명되어있는 다음의 ReferenceType에 RelationalExpression의 캐스트가 은 컴파일 타임 오류로 거부 될 경우

, 다음 instanceof를 관계형 표현은 마찬가지로 컴파일 타임 오류가 발생합니다 . 이러한 상황에서 instanceof 표현식의 결과는 결코 일 수 없습니다.

+0

예, 이해합니다! 'String'과'Integer' 모두 final 클래스이기 때문에'String'이나'Integer'에 의해 참조되는 객체는 절대로'A'를 구현할 수 없기 때문입니다. 'B' (또는'HashMap')는 final이 아니므로 하위 클래스가 A를 구현할 수 있으므로 컴파일러는 이러한 비교가 무의미하다는 것을 확신 할 수 없습니다. –