type in Java 8

Als we het datatype van de variabele in javascript willen controleren, kunnen we de operator typeofgebruiken.

Beschouw dit fragment

var c = 'str' ;
console.log(typeof(c)); // string
c = 123 ;
console.log(typeof(c)); // number
c =  {} ;
console.log(typeof(c)) ; // object

Ik wil dezelfde functionaliteit bereiken in java 8. Java heeft geen operator typeof, maar er is de operator instanceofom de typen te controleren.

System.out.println("str" instanceof String);  // true 
Integer a  = 12 ;
System.out.println(a instanceof Integer);
Float f = 12.3f
System.out.println(f instanceof Float); // true

Kunnen we het nog beter doen? Bovendien ondersteunt instanceofgeen primitieve typen.

Is er een benadering in java 8? Alle relevante benaderingen worden op prijs gesteld.


Antwoord 1, autoriteit 100%

U kunt de getClass()methode om het type object te krijgen dat u gebruikt:

Object obj = null;
obj = new ArrayList<String>();
System.out.println(obj.getClass());
obj = "dummy";
System.out.println(obj.getClass());
obj = 4;
System.out.println(obj.getClass());

Dit genereert de volgende uitvoer:

class java.util.ArrayList
class java.lang.String
class java.lang.Integer

Zoals je ziet, wordt het type object weergegeven waarnaar wordt verwezen door de variabele, wat mogelijk niet hetzelfde is als het type van de variabele (Objectin dit geval).

Voor primitieve typen is er geen oplossing omdat het probleem van het kennen van het type dat in een variabele is opgeslagen niet bestaat. Een variabele van het primitieve type kan alleenwaarden van dat type bevatten. Omdat je de variabele (of parameter) ergens moet definiëren, weet je al het type ervan en de waarden die het kan bevatten. Er is geen “basis”-type voor primitieve waarden die u kunt gebruiken, vergelijkbaar met het type Object, dat het basistype is voor alle objecten in Java.


Antwoord 2, autoriteit 30%

Met dank aan @Progman voor de methode getClass().

class check{
    static Class typeof(Integer a)
    {
        return a.getClass();
    }
    static Class typeof(Character c)
    {
        return c.getClass();
    }
    static Class typeof(Float f)
    {
        return f.getClass();
    }
    static Class typeof(Double d)
    {
        return d.getClass();
    }
    static Class typeof(Long l)
    {
        return l.getClass();
    }
    static Class typeof(String s)
    {
        return s.getClass();
    }
}

Dus nu controleren we zowel primitieve als niet-primitieve typen

check.typeof(12) ; // class java.lang.Integer

check.typeof(12.23f) ; // class java.lang.Float

check.typeof('c') ; // class java.lang.Character

check.typeof("str") ; // class java.lang.String

Other episodes