Ê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).
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:
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:
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?
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
classTest{void printType(String x){System.out.print("String");}void printType(int x){System.out.print("Int");}// same goes on with boolean,double,float,object ...}
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
Object o = "o";
- le type de la variable est Object, le type de la valeur est String.List<String> l = new ArrayList<String>();
, le type de la variable estList<String>
, le type de la valeur estArrayList<String>
.Réponses:
la source
a
est assez évidente au moment de la compilationint
valeur est dans uneint
variable, il n'y a aucun moyen d'écrire du code qui gère uneint
valeur et ne connaît pas ce type. La question est différente si vous manipulez un wrapper commeInteger
, mais le code de cette réponse fonctionne à nouveau.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
la source
Double a = 1d; boolean b = a instanceof String;
provoquera une erreurerror: incompatible types: Double cannot be converted to String
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:
Cependant, si vous voulez que cela fonctionne avec tout ce que vous pouvez faire:
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:
Utilisation de génériques:
la source
J'ai appris du moteur de recherche (mon anglais est très mauvais, donc code ...) Comment obtenir le type de variable? UPS :
cette méthode :
maintenant exemple:
la source
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.Field
et de créer votre propreField
classe, puis de déclarer toutes vos variables locales comme cetteField
implé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?la source
Utiliser la fonctionnalité de surcharge d'opérateurs de Java
la source
Je pense que nous avons plusieurs solutions ici:
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
ou
ou
isPrimitive ()
Cela va nous donner:
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
la source