web-dev-qa-db-ja.com

javaでオブジェクトタイプを識別する方法

可能性のある複製:
Javaでのオブジェクトのクラスの決定方法
Javaはオブジェクトがどのクラスであるかを決定します

特定のオブジェクトのオブジェクトタイプを比較する次のサンプル不完全メソッドがあります。

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);

この方法は実際には機能していません。機能させるために私を助けてください

19
Harsha

.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

本当です。

どちらを使用する必要があるかは、要件によって異なります。

37
JB Nizet

クラストークンを互いに比較できるため、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");
    }

ノート:

  • 2つの唯一の違いは、クラストークンの比較では完全一致のみが検出されることですが、instanceof Cは、Cのサブクラスにも一致します。ただし、この場合、リストされているクラスはすべてfinalであるため、サブクラスはありません。したがって、instanceofはおそらくここで問題ありません。
  • jB Nizetが述べたように、そのようなチェックはOO設計ではありません。この問題をもっとOO.

    System.out.println("This is a(n) " + value.getClass().getSimpleName());
    
14
Péter Török

instanceofが必要です:

if (value instanceof Integer)

これは、通常は必要なサブクラスでも当てはまり、nullセーフでもあります。まったく同じクラスが本当に必要な場合は、次のようにすることができます

if (value.getClass() == Integer.class)

または

if (Integer.class.equals(value.getClass())
5
Thilo

つかいます value instanceof YourClass