特定のオブジェクトのオブジェクトタイプを比較する次のサンプル不完全メソッドがあります。
public void test(Object value) {
if (value.getClass() == Integer) {
System.out.println("This is an Integer");
}else if(value.getClass() == String){
System.out.println("This is a String");
}else if(value.getClass() == Float){
System.out.println("This is a Float");
}
}
メソッドは次のように呼び出すことができます。
test("Test");
test(12);
test(10.5f);
この方法は実際には機能していません。機能させるために私を助けてください
.class
を忘れました:
if (value.getClass() == Integer.class) {
System.out.println("This is an Integer");
}
else if (value.getClass() == String.class) {
System.out.println("This is a String");
}
else if (value.getClass() == Float.class) {
System.out.println("This is a Float");
}
この種のコードは通常、貧弱なOOデザインのサインです。
また、オブジェクトのクラスをクラスと比較し、instanceofを使用することも同じではないことに注意してください。例えば:
"foo".getClass() == Object.class
偽ですが、
"foo" instanceof Object
本当です。
どちらを使用する必要があるかは、要件によって異なります。
クラストークンを互いに比較できるため、value.getClass() == Integer.class
を使用できます。ただし、より単純で標準的な方法はinstanceof
を使用することです。
if (value instanceof Integer) {
System.out.println("This is an Integer");
} else if(value instanceof String) {
System.out.println("This is a String");
} else if(value instanceof Float) {
System.out.println("This is a Float");
}
ノート:
instanceof C
は、C
のサブクラスにも一致します。ただし、この場合、リストされているクラスはすべてfinal
であるため、サブクラスはありません。したがって、instanceof
はおそらくここで問題ありません。jB Nizetが述べたように、そのようなチェックはOO設計ではありません。この問題をもっとOO.
System.out.println("This is a(n) " + value.getClass().getSimpleName());
instanceof
が必要です:
if (value instanceof Integer)
これは、通常は必要なサブクラスでも当てはまり、nullセーフでもあります。まったく同じクラスが本当に必要な場合は、次のようにすることができます
if (value.getClass() == Integer.class)
または
if (Integer.class.equals(value.getClass())
つかいます value instanceof YourClass