12

私が知っておくべきトリッキーなことはありinstanceofますか?いくつかのメソッドを介してオブジェクトのリストを渡し、これらのオブジェクトが特定のインターフェイスを実装しているかどうかをinstanceof. 場合によっては、instanceofオブジェクトがインターフェイスを実装していると正しく識別しますが、そうでない場合もあります。同じオブジェクトの異なる場所で一貫性のない結果が得られているようです。ここで知っておくべきトリック/落とし穴はありますか?

あなたが持っているかもしれないコメントを見越して:

1)instanceofフォームが悪いことはわかっています。私は、変更できない完全ではないオブジェクト階層で作業しています。これは、私が考えることができる最も悪いことです。

2) コード例の作成に取り組んでいますが、ここに有用なものを貼り付けるには、コードを大幅に簡素化する必要があります。それまでの間、これを以前に見たことがあり、いくつかの光を当てることができる場合は、そうしてください.

4

6 に答える 6

14

潜在的に異なるクラスローダーから、動的にタイプをロードしていますか?明らかに一貫性のない結果が見られたのは、同じ型を参照しているように見えるが、実際には異なるクラスローダーからその型をロードした2行のコードがあったときだけでした。

于 2009-03-10T16:34:51.233 に答える
9

instanceof常に。を返しfalseますnull。左側の静的型が指定された型のインスタンスになることが不可能な場合はコンパイルされません。それ以外は、驚くことなく動作するはずです。

C ++(そして私はSmalltalkを信じています)とは異なり、オブジェクトは実行時に型を変更できません。C ++では、構築中に型が変更されるため、コンストラクターから派生クラス[サブクラス]メソッドにメソッドを呼び出すことはできません。

于 2009-03-10T16:36:18.373 に答える
9

わかりました、問題は解決しました。いつものように、問題は私が思っていたほど奇抜ではありませんでした。私が取り組んでいるプロジェクトは、いくつかのクラス名が重複しているという不幸な状態にあります。foo.MyInterface を使用してクラスを作成し、bar.MyInterface のインスタンスをテストしていました。回答ありがとうございます。考えるのに本当に役立ちました。

于 2009-03-10T17:00:15.650 に答える
5

私が知っている唯一の落とし穴は、タイプnullがないということです。instanceof

于 2009-03-10T16:34:43.680 に答える
3

クラスローディングの問題がない限り、instanceof は一貫して機能します。A が B から継承されている場合、または A が実装するインターフェイスまたはクラス A が拡張するインターフェイスの一部が instanceof B である場合、A instanceof B は true を返すことをご存知だと思います。

true を期待しているのに false になる場合は、おそらく異なる ClassLoader からのインスタンスを比較しようとしています。

于 2009-03-10T16:38:49.367 に答える
-1

instanceofの代わりに「isAssignable」が必要な場合があります。

if (MyInterface.isAssignableFrom(myObject.getClass())) {
  //  do work here
}

これは、インターフェースを実装するクラスに対してtrueを返します。

于 2009-03-10T16:35:34.413 に答える