programing

instanceof-호환되지 않는 조건부 피연산자 유형

goodcopy 2021. 1. 16. 10:35
반응형

instanceof-호환되지 않는 조건부 피연산자 유형


다음은 잘 컴파일됩니다.

  Object o = new Object();
  System.out.println(o instanceof Cloneable);

그러나 이것은 그렇지 않습니다.

  String s = new String();
  System.out.println(s instanceof Cloneable);

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

무엇이 문제입니까?


문제의 더 노골적인 화신은 다음과 같습니다.

if ("foo" instanceof Number)
   // "Incompatible conditional operand types String and Number"

이것은 JLS 15.20.2 유형 비교 연산자에instanceof 지정되어 있습니다 .

RelationalExpression:
       RelationalExpression instanceof ReferenceType

의 캐스팅 경우 RelationalExpression 받는 사람 의 ReferenceType가 컴파일 타임 오류로 거부 될 것입니다, 다음 instanceof관계식 마찬가지로 컴파일 타임 오류가 발생합니다. 그러한 상황에서 instanceof표현 의 결과는 결코 사실 일 수 없습니다.

즉,이 캐스트 표현식은 컴파일 시간 오류를 생성하기 때문입니다.

(Number) "foo"

그래서이 표현은 :

("foo" instanceof Number)

귀하의 경우는 조금 더 미묘하지만 원칙은 동일합니다.

  • String 마지막 수업입니다
  • String 구현하지 않습니다 Cloneable
  • 그러므로 당신은 할 수 없습니다 (Cloneable) aString
  • 따라서 당신은 또한 할 수 없습니다 aString instanceof Cloneable

내가 최근에 접한 관련 문제 (그리고 무슨 일이 벌어지고 있는지 알아 내기 전에이 페이지로 이끈)는 Eclipse 환경이 'instanceof'표현식에서 "호환되지 않는 조건부 피연산자 유형"을 잘못보고 할 수 있다는 것입니다. 'instanceof'의 오른쪽에 유형에 대한 'import'문이 없습니다. 가져 오기 누락으로 인해 전체 문제가 발생한다는 것을 파악하기 전에 문제의 유형이 어떻게 호환되지 않을 수 있는지 알아 내려고 잠시 시간을 보냈습니다. 이 정보가 누군가의 시간을 절약하기를 바랍니다.


컴파일러 String는 이것이 최종 클래스 임을 알고 Cloneable. 그래서 문자열의 어떤 인스턴스 수 이제까지 의 인스턴스 수 없습니다 Cloneable. 실제로 항상 "false"를 인쇄 할 때 의미있는 테스트를 받았다고 생각하지 못하게합니다.

참조 URL : https://stackoverflow.com/questions/2551337/instanceof-incompatible-conditional-operand-types

반응형