web-dev-qa-db-ja.com

instanceof-互換性のない条件オペランドタイプ

以下は正常にコンパイルされます:

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

しかし、これはそうではありません:

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

コンパイラエラーがスローされます。

何が問題ですか?

53
java_geek

問題のより露骨な化身は次のとおりです。

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は最終クラスです
  • StringCloneableを実装しません
  • したがって、(Cloneable) aString
  • そのため、aString instanceof Cloneable
51

私が最近遭遇した関連する問題(そして何が起こっているかを理解する前にこのページにつながった)は、Eclipse環境が「instanceof」式で「互換性のない条件オペランドタイプ」を誤って報告する可能性があることです「instanceof」の右側にあるタイプの「import」ステートメントがありません。インポートの欠落が問題全体を引き起こしていることを理解する前に、問題の型がどのように互換性がないのかを理解しようとしてしばらく費やしました。この情報が誰かの時間を節約することを願っています。

151
Some Guy

コンパイラは、Stringが最終クラスであり、Cloneableを実装しないことを知っています。したがって、StringのインスタンスはeverCloneableのインスタンスになることはできません。実際には常に「false」と表示されるのに、意味のあるテストを行っていると考えるのを止めています。

28
Jon Skeet