以下は正常にコンパイルされます。
Object o = new Object();
System.out.println(o instanceof Cloneable);
しかし、これはしません:
String s = new String();
System.out.println(s instanceof Cloneable);
コンパイラ エラーがスローされます。
何が問題ですか?
以下は正常にコンパイルされます。
Object o = new Object();
System.out.println(o instanceof Cloneable);
しかし、これはしません:
String s = new String();
System.out.println(s instanceof Cloneable);
コンパイラ エラーがスローされます。
何が問題ですか?
私が最近遭遇した関連する問題(そして何が起こっているのかを理解する前にこのページに私を導いた)は、Eclipse環境が「instanceof」式で「互換性のない条件付きオペランドタイプ」を誤って報告する可能性があることです'instanceof'の右側にあるタイプの'import'ステートメントがありません。インポートの欠落が問題全体の原因であることがわかる前に、問題の型がどのように互換性がない可能性があるかを理解しようとしばらく時間を費やしました。うまくいけば、この情報が誰かの時間を節約するでしょう。
あなたの問題のより露骨な化身は次のとおりです。
if ("foo" instanceof Number)
// "Incompatible conditional operand types String and Number"
これは、JLS 15.20.2 Type comparison operatorinstanceof
で指定されています。
RelationalExpression: RelationalExpression instanceof ReferenceType
RelationalExpressionのReferenceTypeへのキャストがコンパイル時エラーとして拒否される場合、
instanceof
関係式も同様にコンパイル時エラーを生成します。このような状況では、instanceof
式の結果が真になることはありません。
つまり、このキャスト式はコンパイル時エラーを生成するためです。
(Number) "foo"
次の式も同様です。
("foo" instanceof Number)
あなたのケースはもう少し微妙ですが、原則は同じです:
String
最終クラスですString
実装しないCloneable
(Cloneable) aString
aString instanceof Cloneable
コンパイラはそれString
が最終クラスであることを認識しており、実装していませんCloneable
。したがって、 String のインスタンスがのインスタンスになることはありませんCloneable
。実際には常に「false」と出力されるのに、意味のあるテストを取得したと考えるのを妨げています。