このコードがコンパイルされないのはなぜですか?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
クラス変数を に渡せないのはなぜinstanceof
ですか?
このコードがコンパイルされないのはなぜですか?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
クラス変数を に渡せないのはなぜinstanceof
ですか?
このinstanceof
演算子は、 などの参照型では機能Integer
しますが、 などのオブジェクトでは機能しませんnew Integer(213)
。あなたはおそらく次のようなものが欲しい
clazz.isInstance(obj)
補足:次のように書くと、コードがより簡潔になります
public boolean isOf(Class clazz, Object obj){
return clazz.isInstance(obj)
}
ただし、メソッドがもう必要かどうかはよくわかりません。
instanceof
明示的なクラス名 (コンパイル時に記述) でのみ使用できます。実行時チェックを行うには、次のことを行う必要があります。
clazz.isInstance(obj)
clazz.isAssignableFrom(..)
ケースをより適切に処理するため、これにはわずかな利点がありobj == null
ます。
他の人が述べたように、クラス変数はObjectinstanceof
のインスタンスを参照するため、クラス変数を渡すことはできませんが、の右手はtypeでなければなりません。つまり、「y はオブジェクト x のインスタンスである」という意味ではなく、「y は型 X のインスタンスである」という意味です。オブジェクトとタイプの違いがわからない場合は、次のことを考慮してください。 instanceof
instanceof
Object o = new Object();
ここで、型はObject
でありo
、その型を持つオブジェクトのインスタンスへの参照です。したがって:
if(o instanceof Object)
有効ですが
if(o instanceof o)
o
右側がタイプではなくオブジェクトであるためではありません。
あなたのケースにより具体的には、クラスインスタンスはタイプではなく、オブジェクトです(JVMによって作成されます)。あなたのメソッドでClass
は、タイプですclazz
が、オブジェクトです(まあ、オブジェクトへの参照)
必要なのは、オブジェクトをクラス オブジェクトと比較する方法です。これは人気があることが判明したため、これは Class Object: のメソッドとして提供されていますisInstance()
。
isInstance の Java Doc は、これをよりよく説明しています。
public boolean isInstance(Object obj)
指定された Object が、この Class によって表されるオブジェクトと代入互換性があるかどうかを判断します。このメソッドは、Java 言語の instanceof 演算子に相当する動的なものです。指定された Object 引数が null ではなく、ClassCastException を発生させることなく、この Class オブジェクトによって表される参照型にキャストできる場合、メソッドは true を返します。それ以外の場合は false を返します。
具体的には、この Class オブジェクトが宣言されたクラスを表している場合、指定された Object 引数が表されたクラス (またはそのサブクラス) のインスタンスである場合、このメソッドは true を返します。それ以外の場合は false を返します。この Class オブジェクトが配列クラスを表す場合、指定された Object 引数を恒等変換または拡大参照変換によって配列クラスのオブジェクトに変換できる場合、このメソッドは true を返します。それ以外の場合は false を返します。この Class オブジェクトがインターフェイスを表す場合、指定された Object 引数のクラスまたはスーパークラスがこのインターフェイスを実装していれば、このメソッドは true を返します。それ以外の場合は false を返します。この Class オブジェクトがプリミティブ型を表す場合、このメソッドは false を返します。
パラメータ: obj - チェックするオブジェクト
戻り値: obj がこのクラスのインスタンスである場合は true導入されたバージョン
: JDK1.1
まず、instanceof
右側のオペランドが実際のクラス ( obj instanceof Object
or などobj instanceof Integer
) であり、 type の変数ではないことが必要ですClass
。第二に、あなたは本当にやってはいけないかなり一般的な初心者の間違いを犯しました...次のパターン:
if (条件式){ true を返します。 } そうしないと{ false を返します。 }
上記は次のようにリファクタリングできます。
conditional_expressionを返します。
冗長な if...else ステートメントを排除するため、常にそのリファクタリングを実行する必要があります。同様に、式は同じ結果にリファクタリングできます。return conditional_expression ? true : false;