以下は正常にコンパイルされます:
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
を実装しないことを知っています。したがって、StringのインスタンスはeverがCloneable
のインスタンスになることはできません。実際には常に「false」と表示されるのに、意味のあるテストを行っていると考えるのを止めています。