Comment connaissez-vous un type de variable en java?

152

Disons que je déclare une variable:

String a = "test";

Et je veux savoir de quel type il s'agit, c'est-à-dire que le résultat doit être java.lang.StringComment faire?

Miguel Ribeiro
la source
1
Êtes-vous vraiment intéressé par le type de variable ? Ou vous souciez-vous du type de valeur ? Parce que le type de la variable ne peut pas être facilement obtenu (en fait, ce n'est pas du tout possible pour les variables locales et nécessite une réflexion pour les champs).
Joachim Sauer
8
@Paul: Considérez Object o = "o";- le type de la variable est Object, le type de la valeur est String.
Michael Borgwardt
2
@Paul In List<String> l = new ArrayList<String>();, le type de la variable est List<String>, le type de la valeur est ArrayList<String>.
Ben Lings
1
@Ben Lings Le type de variable est java.util.ArrayList et le type de valeur est java.util.ArrayList.
Ajay Takur
1
@AjayThakur - c'est la différence entre le type de compilation (statique) et le type d'exécution (dynamique).
Ben Lings

Réponses:

269
a.getClass().getName()
Martin
la source
16
Cela donnera le type de la valeur. pas nécessairement le type de la variable.
Joachim Sauer
7
J'ai juste pensé que c'était ce que l'OP recherchait vraiment puisque la déclaration de aest assez évidente au moment de la compilation
Martin
4
Cela fonctionnerait si les types ne sont pas des primitives ... Si le type est int, comment connaître le type?
Miguel Ribeiro
5
@Miguel: puisque la seule façon de gérer une intvaleur est dans une intvariable, il n'y a aucun moyen d'écrire du code qui gère une intvaleur et ne connaît pas ce type. La question est différente si vous manipulez un wrapper comme Integer, mais le code de cette réponse fonctionne à nouveau.
Joachim Sauer
1
ce n'est pas vrai pour un type primitif.
Mehdi
37

Si vous voulez le nom, utilisez la méthode de Martin. Si vous voulez savoir s'il s'agit d'une instance d'une certaine classe:

boolean b = a instanceof String

Martin Konecny
la source
15
n'est-ce pas Martin aussi? :)
seokhoonlee
The other Martin ... LOL;)
chankruze
Le code Thic Double a = 1d; boolean b = a instanceof String;provoquera une erreurerror: incompatible types: Double cannot be converted to String
Alex78191
35

Je voudrais développer la réponse de Martin là-bas ...

Sa solution est plutôt sympa, mais elle peut être modifiée pour que tout "type variable" puisse être imprimé comme ça (il s'agit en fait de Value Type, plus sur le sujet ). Cela dit, «modifié» peut être un mot fort pour cela. Quoi qu'il en soit, cela peut être utile.

Solution Martins:

a.getClass().getName()

Cependant, si vous voulez que cela fonctionne avec tout ce que vous pouvez faire:

((Object) myVar).getClass().getName()
//OR
((Object) myInt).getClass().getSimpleName()

Dans ce cas, la primitive sera simplement enveloppée dans un wrapper. Vous obtiendrez l'objet de la primitive dans ce cas.

Je l'ai moi-même utilisé comme ceci:

private static String nameOf(Object o) {
    return o.getClass().getSimpleName();
}

Utilisation de génériques:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}
Atspulgs
la source
Intéressant. J'ai juste essayé votre code sur: System.out.println (((Object) Integer.parseInt ("12")) .getClass (). GetSimpleName ()); et il fonctionne! \ o /
shevy
31

J'ai appris du moteur de recherche (mon anglais est très mauvais, donc code ...) Comment obtenir le type de variable? UPS :

String str = "test";
String type = str.getClass().getName();
value: type = java.lang.String

cette méthode :

str.getClass().getSimpleName();
value:String

maintenant exemple:

Object o = 1;
o.getClass().getSimpleName();
value:Integer
Copier coller
la source
3

Je suis d'accord avec ce que dit Joachim Sauer, impossible de savoir (le type de variable! Pas le type de valeur!) À moins que votre variable ne soit un attribut de classe (et vous auriez à récupérer les champs de classe, obtenir le bon champ par nom ...)

En fait pour moi, il est totalement impossible qu'aucune a.xxx().yyy()méthode vous donne la bonne réponse puisque la réponse serait différente sur exactement le même objet, selon le contexte dans lequel vous appelez cette méthode ...

Comme l'a dit teehoo, si vous savez lors de la compilation d'une liste définie de types à tester, vous pouvez utiliser instanceof mais vous obtiendrez également des sous-classes retournant true ...

Une solution possible serait également de vous inspirer de l'implémentation de java.lang.reflect.Fieldet de créer votre propre Fieldclasse, puis de déclarer toutes vos variables locales comme cette Fieldimplémentation personnalisée ... mais vous feriez mieux de trouver une autre solution, je me demande vraiment pourquoi vous avez besoin de la variable type, et pas seulement le type de valeur?

Sébastien Lorber
la source
Pour "mais vous obtiendrez également des sous-classes retournant true ..." , je pense que vous vouliez dire "mais vous obtiendrez également des classes parents retournant true ..." , non?
skomisa
3

Utiliser la fonctionnalité de surcharge d'opérateurs de Java

class Test {

    void printType(String x) {
        System.out.print("String");
    }

    void printType(int x) {     
        System.out.print("Int");
    }

    // same goes on with boolean,double,float,object ...

}
epicwhat001
la source
8
Java n'a pas le concept de surcharge d'opérateur, il s'agit d'une surcharge de méthode
nicoschl
2

Je pense que nous avons plusieurs solutions ici:

  • exemple de pourrait être une solution.

Pourquoi? En Java, chaque classe est héritée de la classe Object elle-même. Donc, si vous avez une variable et que vous souhaitez connaître son type. Vous pouvez utiliser

  • System.out.println (((Objet) f) .getClass (). GetName ());

ou

  • Integer.class.isInstance (1985); // donne vrai

ou

  • isPrimitive ()

    public static void main(String[] args) {
    
     ClassDemo classOne = new ClassDemo();
     Class classOneClass = classOne();
    
     int i = 5;
     Class iClass = int.class;
    
     // checking for primitive type
     boolean retval1 = classOneClass.isPrimitive();
     System.out.println("classOneClass is primitive type? = " + retval1);
    
     // checking for primitive type?
     boolean retval2 = iClass.isPrimitive();
     System.out.println("iClass is primitive type? = " + retval2);
    }

Cela va nous donner:

  1. FAUX
  2. VRAI

En savoir plus ici: Comment déterminer le type primitif d'une variable primitive?

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html

Karoly
la source