Hoe het type variabele in Java te controleren?

Hoe kan ik controleren of mijn variabele een int, array, double, etc… is?

Bewerken: hoe kan ik bijvoorbeeld controleren of een variabele een array is? Is er een functie om dit te doen?


Antwoord 1, autoriteit 100%

Java is een statisch getypeerde taal, dus de compiler doet het meeste van deze controle voor u. Zodra u een variabele als een bepaald type declareert, zorgt de compiler ervoor dat er alleen waarden van dat type aan worden toegewezen (of waarden die subtypen van dat type zijn).

De voorbeelden die je gaf (int, array, double) dit zijn allemaal primitieven, en er zijn geen subtypes van. Dus, als je een variabele declareert als een int:

int x;

Je kunt er zeker van zijn dat het alleen intwaarden zal bevatten.

Als je een variabele echter als Listhebt gedeclareerd, is het mogelijk dat de variabele subtypes van Listbevat. Voorbeelden hiervan zijn ArrayList, LinkedList, enz.

Als u een List-variabele had en u moest weten of het een ArrayListwas, kunt u het volgende doen:

List y;
...
if (y instanceof ArrayList) { 
  ...its and ArrayList...
}

Als je echter denkt dat je dat moet doen, wil je misschien je aanpak heroverwegen. Als u objectgeoriënteerde principes volgt, hoeft u dit in de meeste gevallen niet te doen. Er zijn natuurlijk uitzonderingen op elke regel.


Antwoord 2, autoriteit 36%

Eigenlijk vrij eenvoudig om je eigen tester te gebruiken, door misbruik te maken van Java’s methode-overbelastingsmogelijkheid. Al ben ik nog steeds benieuwd of er een officiële methode in de sdk zit.

Voorbeeld:

class Typetester {
    void printType(byte x) {
        System.out.println(x + " is an byte");
    }
    void printType(int x) {
        System.out.println(x + " is an int");
    }
    void printType(float x) {
        System.out.println(x + " is an float");
    }
    void printType(double x) {
        System.out.println(x + " is an double");
    }
    void printType(char x) {
        System.out.println(x + " is an char");
    }
}

dan:

Typetester t = new Typetester();
t.printType( yourVariable );

Antwoord 3, autoriteit 26%

a.getClass().getName()– geeft u het datatype van het werkelijke object waarnaar wordt verwezen door a, maar niet het datatype dat de variabele awas oorspronkelijk gedeclareerd als of later gecast naar.

boolean b = a instanceof String– geeft aan of het werkelijke object waarnaar wordt verwezen door aal dan niet een instantie van een specifieke klasse is.
Nogmaals, het datatype waarnaar de variabele aoorspronkelijk is gedeclareerd of waarnaar vervolgens is gecast, heeft geen invloed op het resultaat van de instanceof-operator.

Ik heb deze informatie overgenomen van:
Hoe herken je een variabel type in Java?

Dit kan gebeuren. Ik probeer een Stringte ontleden in een int en ik zou graag willen weten of mijn Integer.parseInt(s.substring(a, b))eruit gaat een int of vuilnis voordat ik het probeer samen te vatten.

Trouwens, dit staat bekend als Reflection. Hier is wat meer informatie over het onderwerp: http://docs.oracle.com/javase/tutorial/ reflecteren/


Antwoord 4, Autoriteit 16%

Gebruik gewoon:

.getClass().getSimpleName();

Voorbeeld:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());

Uitgang:

StringBuilder

Antwoord 5, Autoriteit 12%

U kunt met geheel getal werken in plaats van int, dubbele in plaats van dubbel, enz. (dergelijke klassen bestaan ​​voor alle primitieve typen).
Dan kunt u de operator-instantie gebruiken, zoals if(var instanceof Integer){...}


Antwoord 6, Autoriteit 7%

Nou, ik denk dat het controleren van het type variabele op deze manier kan worden gedaan.

public <T extends Object> void checkType(T object) {    
    if (object instanceof Integer)
        System.out.println("Integer ");
    else if(object instanceof Double)
        System.out.println("Double ");
    else if(object instanceof Float)
        System.out.println("Float : ");
    else if(object instanceof List)
        System.out.println("List! ");
    else if(object instanceof Set)
        System.out.println("Set! ");
}

Op deze manier hoef je geen meerdere overbelaste methoden te hebben. Ik denk dat het goede praktijken is om collecties te gebruiken boven arrays als gevolg van de extra voordelen. Dat gezegd hebbende, ik weet niet hoe ik moet controleren op een array-type. Misschien kan iemand deze oplossing verbeteren. Ik hoop dat dit helpt!

P.S Ja, ik weet dat dit ook niet controleert op primitieven.


Antwoord 7, Autoriteit 5%

Het eerste deel van uw vraag is zinloos. Er is geen omstandigheid waarin u het type van een primitieve variabele niet weet tijdens het compileren.

Over het tweede deel, de enige omstandigheid dat je niet al weet of een variabele een array is, is of het een Object is. In dat geval zal object.getClass().isArray()het je vertellen.


Antwoord 8, autoriteit 4%

Ik deed het met: if(x.getClass() == MyClass.class){...}


Antwoord 9, autoriteit 2%

In principe, bijvoorbeeld:

public class Kerem
{
    public static void main(String[] args)
    {
        short x = 10;
        short y = 3;
        Object o = y;
        System.out.println(o.getClass()); // java.lang.Short
    }
}

Antwoord 10, autoriteit 2%

Ik was niet blij met een van deze antwoorden, en de juiste heeft geen verklaring en negatieve stemmen, dus ik heb rondgekeken, wat dingen gevonden en het aangepast zodat het gemakkelijk te begrijpen is. Speel er eens mee, niet zo rechttoe rechtaan als je zou hopen.

//move your variable into an Object type
Object obj=whatYouAreChecking;
System.out.println(obj);
// moving the class type into a Class variable
Class cls=obj.getClass();
System.out.println(cls);
// convert that Class Variable to a neat String
String answer = cls.getSimpleName();
System.out.println(answer);

Hier is een methode:

public static void checkClass (Object obj) {
    Class cls = obj.getClass();
    System.out.println("The type of the object is: " + cls.getSimpleName());       
}

Antwoord 11

Geen van deze antwoorden werkt als de variabele een niet-geïnitialiseerd generiek type is

En van wat ik kan vinden, is het alleen mogelijk met een extreem lelijke oplossing, of door een geïnitialiseerde parameter door te geven aan uw functie, zodat deze op zijn plaats wordt, zie hier:

<T> T MyMethod(...){ if(T.class == MyClass.class){...}}

Is NIET geldig omdat u het type niet rechtstreeks uit de parameter Tkunt halen, omdat het tijdens runtime wordt gewist.

<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}

Dit werkt omdat de beller verantwoordelijk is voor het instantiëren van de variabele outvoordat hij belt. Dit zal nog steeds een uitzondering genereren als out null is wanneer het wordt aangeroepen, maar vergeleken met de gekoppelde oplossing is dit verreweg de gemakkelijkste manier om dit te doen

Ik weet dat dit een soort specifieke toepassing is, maar aangezien dit het eerste resultaat op google is voor het vinden van het type variabele met java (en gezien het feit dat Teen soort variabele is), Ik vind dat het moet worden opgenomen


Antwoord 12

Je kunt het gemakkelijk controleren met de Java.lang.Class.getSimpleName()-methode Alleen als de variabele een niet-primitief type heeft. Het werkt niet met primitieve typen int ,long etc.

referentie – Hier is de Oracle docs-link


Antwoord 13

Ik kwam op deze vraag toen ik probeerde iets soortgelijks werkend te krijgen met Generics. Door enkele van de antwoorden te nemen en getClass().isArray() toe te voegen, krijg ik het volgende dat lijkt te werken.

public class TypeTester <T extends Number>{
<T extends Object> String tester(T ToTest){
    if (ToTest instanceof Integer) return ("Integer");
    else if(ToTest instanceof Double) return ("Double");
    else if(ToTest instanceof Float) return ("Float");
    else if(ToTest instanceof String) return ("String");
    else if(ToTest.getClass().isArray()) return ("Array");
    else return ("Unsure");
}
}

Ik noem het zo waar het myArray-gedeelte eenvoudigweg was om een array in callFunction.tester() te krijgen om het te testen.

public class Generics {
public static void main(String[] args) {
    int [] myArray = new int [10];
    TypeTester<Integer> callFunction = new TypeTester<Integer>();
    System.out.println(callFunction.tester(myArray));
}
}

Je kunt de myArray in de laatste regel omwisselen voor bijvoorbeeld 10.2F om Float te testen, enz.


Antwoord 14

public static void chkType(Object var){     
        String type = var.getClass().toString();
        System.out.println(type.substring(16));     
        //assertEquals(type,"class java.lang.Boolean");
        //assertEquals(type,"class java.lang.Character");
        //assertEquals(type,"class java.lang.Integer");
        //assertEquals(type,"class java.lang.Double");      
    }

Other episodes