不快ではありませんが、コンパイラに何をしたいのかを伝える必要があります。これは、コンパイラが何をしようとしているのかを推測するための代替手段となるためです。確かに、「オブジェクトのタイプをチェックしている場合、明らかに、それはそのタイプにキャストしたいという意味であるに違いありません」と思うかもしれません。しかし、誰が言いますか?多分それはあなたがしていることであり、多分そうではありません。
確かに、次のような単純なケースでは
if (x instanceof Integer)
{
Integer ix=(Integer) x;
...
私の意図はかなり明白です。またはそれは?多分私が本当に欲しいのは:
if (x instanceof Integer || x instanceof Double)
{
Number n=(Number) x;
... work with n ...
または私が書いた場合はどうなりますか:
if (x instanceof Integer || x instanceof String)
コンパイラが次に何をすることを期待しますか?xに対してどのタイプを想定する必要がありますか?
instanceofは廃止されている、またはそうでなければ悪い考えであるというコメントを再確認してください。それは確かに誤用される可能性があります。私は最近、元の作成者が6つのクラスを作成し、それらがすべてページとページの長さであるが、互いに同一であることが判明したプログラムに取り組みました。それらを使用する唯一の明白な理由は、「xinstanceofclassA」と「 x instanceof classB "など。つまり、彼はクラスを型フラグとして使用しました。クラスを1つだけにして、さまざまなタイプの列挙型を追加する方がよいでしょう。しかし、非常に良い使い方もたくさんあります。おそらく最も明白なのは次のようなものです:
public MyClass
{
int foo;
String bar;
public boolean equals(Object othat)
{
if (!(othat instanceof MyClass))
return false;
MyClass that=(MyClass) othat;
return this.foo==that.foo && this.bar.equals(that.bar);
}
... etc ...
}
instanceofを使用せずにそれをどのように行いますか?パラメータをObjectではなくMyClassタイプにすることができます。しかし、それを汎用オブジェクトで呼び出す方法すらありません。これは多くの場合非常に望ましいことです。実際、たとえば、文字列と整数の両方をコレクションに含めたい場合や、異なる型の比較で単純にfalseを返したい場合があります。