Hoe objecttypes in Java te identificeren

Mogelijk duplicaat:
Hoe bepaal je de klasse van een object (in Java)?< br>
Java bepaalt welke klasse een object is

Ik heb het volgende voorbeeld van een onvolledige methode om het objecttype van een bepaald object te vergelijken

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

De methode kan worden aangeroepen als:

test("Test");
test(12);
test(10.5f);

deze methode werkt niet echt, help me alstublieft om het te laten werken


Antwoord 1, autoriteit 100%

Je bent de .classvergeten:

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

Merk op dat dit soort code meestal het teken is van een slecht OO-ontwerp.

Houd er ook rekening mee dat het vergelijken van de klasse van een object met een klasse en het gebruik van instanceof niet hetzelfde is. Bijvoorbeeld:

"foo".getClass() == Object.class

is onwaar, terwijl

"foo" instanceof Object

is waar.

Of de ene of de andere moet worden gebruikt, hangt af van uw vereisten.


Antwoord 2, autoriteit 34%

Je kunt klassetokens met elkaar vergelijken, dus je zou value.getClass() == Integer.classkunnen gebruiken. De eenvoudigere en meer canonieke manier is echter om instanceof:

te gebruiken

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

Opmerkingen:

  • het enige verschil tussen de twee is dat het vergelijken van klassetokens alleen exacte overeenkomsten detecteert, terwijl instanceof Cook overeenkomt met subklassen van C. In dit geval zijn alle vermelde klassen echter final, dus ze hebben geen subklassen. Dus instanceofis hier waarschijnlijk goed.
  • zoals JB Nizet zei, dergelijke cheques zijn geen OO-ontwerp. U kunt dit probleem wellicht op een meer OO-manier oplossen, bijv.

    System.out.println("This is a(n) " + value.getClass().getSimpleName());
    

Antwoord 3, autoriteit 9%

U wilt instanceof:

if (value instanceof Integer)

Dit geldt zelfs voor subklassen, wat meestal is wat je wilt, en het is ook null-safe. Als je echt exact dezelfde les nodig hebt, zou je dat kunnen doen

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

of

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

Antwoord 4, autoriteit 6%

Gebruik value instanceof YourClass

Other episodes