57

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

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

しかし、これはしません:

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

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

何が問題ですか?

4

3 に答える 3

157

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

于 2012-01-04T19:10:14.263 に答える
57

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

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

これは、JLS 15.20.2 Type comparison operatorinstanceofで指定されています。

RelationalExpression:
       RelationalExpression instanceof ReferenceType

RelationalExpressionReferenceTypeへのキャストがコンパイル時エラーとして拒否される場合、instanceof関係式も同様にコンパイル時エラーを生成します。このような状況では、instanceof式の結果が真になることはありません。

つまり、このキャスト式はコンパイル時エラーを生成するためです。

(Number) "foo"

次の式も同様です。

("foo" instanceof Number)

あなたのケースはもう少し微妙ですが、原則は同じです:

  • String最終クラスです
  • String実装しないCloneable
  • したがって、あなたはできません(Cloneable) aString
  • したがって、あなたもできませんaString instanceof Cloneable
于 2010-03-31T09:41:18.420 に答える
30

コンパイラはそれStringが最終クラスであることを認識しており、実装していませんCloneable。したがって、 String のインスタンスがのインスタンスになることはありませCloneable。実際には常に「false」と出力されるのに、意味のあるテストを取得したと考えるのを妨げています。

于 2010-03-31T08:12:13.450 に答える