Java est un langage à typage statique, donc le compilateur effectue la plupart de cette vérification pour vous. Une fois que vous déclarez une variable comme étant d'un certain type, le compilateur s'assurera qu'elle ne reçoit que des valeurs de ce type (ou des valeurs qui sont des sous-types de ce type).
Les exemples que vous avez donnés ( int, array, double) sont tous des primitifs, et il n'y en a pas de sous-types. Ainsi, si vous déclarez une variable comme étant un int:
int x;
Vous pouvez être sûr qu'il ne contiendra jamais que des intvaleurs.
ListCependant, si vous avez déclaré une variable comme étant a , il est possible que la variable contienne des sous-types de List. Des exemples de ceux - ci comprennent ArrayList, LinkedListetc.
Si vous aviez une Listvariable et que vous aviez besoin de savoir si c'était une ArrayList, vous pouvez effectuer les opérations suivantes:
List y;...if(y instanceofArrayList){...its and ArrayList...}
Cependant, si vous pensez que vous devez le faire, vous voudrez peut-être repenser votre approche. Dans la plupart des cas, si vous suivez les principes orientés objet, vous n'aurez pas besoin de le faire. Il y a, bien sûr, des exceptions à chaque règle, cependant.
L'opérateur instanceof détermine uniquement le type de données de l'objet référencé par la variable. Il ne détermine pas le type de données de la VARIABLE réelle comme demandé à l'origine.
GrantRobertson
38
En fait, il est assez facile de lancer votre propre testeur, en abusant de la capacité de surcharge de méthode de Java. Bien que je sois toujours curieux de savoir s'il existe une méthode officielle dans le SDK.
Exemple:
classTypetester{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");}}
puis:
Typetester t =newTypetester();
t.printType( yourVariable );
Pas une bonne méthode IMO. Que se passe-t-il si je passe un type arbitraire qui n'est pas défini dans votre classe Typetester - dans cette instance String, par exemple?
Tash Pemhiwa
6
@TashPemhiwa puis ajoutez String et Object aux choix. La créativité et la résolution de problèmes sont les meilleurs atouts des programmeurs.
Kato
8
Pourtant, cela ne peut traiter qu'un ensemble fixe de classes prédéfinies (ce qui va à l'encontre de l'objectif d'orientation / polymorphisme d'objet) et ne vous donnera que quelque chose comme "classe inconnue" pour les objets de toute autre classe
Algoman
3
Le choix de la signature qui se produit au moment de la compilation, pas à l'exécution. Donc, cette technique ne vous dira rien que vous ne savez déjà au moment de la compilation. docs.oracle.com/javase/specs/jls/se7/html/…
jmh
26
a.getClass().getName()- vous donnera le type de données de l'objet réel référencé par a, mais pas le type de données dans lequel la variable a aété initialement déclarée ou vers laquelle il a été converti ultérieurement.
boolean b = a instanceof String- vous indiquera si l'objet réel auquel fait référence aest une instance d'une classe spécifique. Encore une fois, le type de données dans lequel la variable aa été déclarée à l'origine ou vers laquelle il a été converti par la suite n'a aucune incidence sur le résultat de l'opérateur instanceof.
Cela peut arriver. J'essaie d'analyser un Stringdans un int et j'aimerais savoir si mon Integer.parseInt(s.substring(a, b))est en train de jeter un int ou une poubelle avant d'essayer de le résumer.
Vous pouvez travailler avec Integer au lieu de int, Double au lieu de double, etc. (de telles classes existent pour tous les types primitifs). Ensuite, vous pouvez utiliser l'opérateur instanceof, commeif(var instanceof Integer){...}
De cette façon, vous n'avez pas besoin d'avoir plusieurs méthodes surchargées. Je pense que c'est une bonne pratique d'utiliser des collections sur des tableaux en raison des avantages supplémentaires. Cela dit, je ne sais pas comment vérifier un type de tableau. Peut-être que quelqu'un peut améliorer cette solution. J'espère que cela t'aides!
PS Oui, je sais que cela ne vérifie pas non plus les primitives.
La première partie de votre question n'a pas de sens. Il n'y a aucune circonstance dans laquelle vous ne connaissez pas le type d'une variable primitive au moment de la compilation.
Concernant la deuxième partie, la seule circonstance où vous ne savez pas déjà si une variable est un tableau est si c'est un objet. Dans ce cas object.getClass().isArray(), vous le direz.
Je pourrais avoir un hashmap d'une chaîne à l'autre, mettre un int dans ce hashmap et le retirer. La seule chose que je sais, c'est que c'est un "objet" et que je pourrais avoir à vérifier de quel type il s'agit. Ne pas dire que c'est bien, juste dire que c'est possible.
matty-d
5
Je l'ai fait en utilisant: if(x.getClass() == MyClass.class){...}
Je n'étais satisfait d'aucune de ces réponses, et celle qui est juste n'a pas d'explication et des votes négatifs, alors j'ai cherché, trouvé des choses et les ai modifiées pour qu'elles soient faciles à comprendre. Jouez avec, pas aussi simple qu'on pourrait l'espérer.
//move your variable into an Object typeObject obj=whatYouAreChecking;System.out.println(obj);// moving the class type into a Class variableClass cls=obj.getClass();System.out.println(cls);// convert that Class Variable to a neat StringString answer = cls.getSimpleName();System.out.println(answer);
Voici une méthode:
publicstaticvoid checkClass (Object obj){Class cls = obj.getClass();System.out.println("The type of the object is: "+ cls.getSimpleName());}
Aucune de ces réponses ne fonctionne si la variable est un type générique non initialisé
Et d'après ce que je peux trouver, ce n'est possible qu'en utilisant une solution de contournement extrêmement moche , ou en passant un paramètre initialisé à votre fonction, en le rendant en place, voir ici:
<T> T MyMethod(...){if(T.class==MyClass.class){...}}
N'est PAS valide car vous ne pouvez pas extraire Tdirectement le type du paramètre, car il est effacé au moment de l'exécution.
Cela fonctionne car l'appelant est responsable de l'instanciation de la variable outavant l'appel. Cela lèvera toujours une exception si out est nul lorsqu'il est appelé, mais par rapport à la solution liée, c'est de loin le moyen le plus simple de le faire
Je sais que c'est une sorte d'application spécifique, mais comme c'est le premier résultat sur google pour trouver le type d'une variable avec java (et étant donné qu'il Ts'agit d'une sorte de variable), je pense qu'il devrait être inclus
Vous pouvez le vérifier facilement en utilisant Java.lang.Class.getSimpleName()Method Only si la variable a un type non primitif. Cela ne fonctionne pas avec les types primitifs int, long etc.
Un petit indice: quand il y a une question qui a 10 ans et qui a> 10 réponses dont certaines ont plus de 100 votes positifs, alors il est (pas impossible mais) très , très improbable qu'une nouvelle réponse puisse ajouter quelque chose d'utile (en particulier, quand c'est juste un extrait de code qui dit "Ici, regarde, ça imprime quelque chose" ...)
Réponses:
Java est un langage à typage statique, donc le compilateur effectue la plupart de cette vérification pour vous. Une fois que vous déclarez une variable comme étant d'un certain type, le compilateur s'assurera qu'elle ne reçoit que des valeurs de ce type (ou des valeurs qui sont des sous-types de ce type).
Les exemples que vous avez donnés (
int
, array,double
) sont tous des primitifs, et il n'y en a pas de sous-types. Ainsi, si vous déclarez une variable comme étant unint
:Vous pouvez être sûr qu'il ne contiendra jamais que des
int
valeurs.List
Cependant, si vous avez déclaré une variable comme étant a , il est possible que la variable contienne des sous-types deList
. Des exemples de ceux - ci comprennentArrayList
,LinkedList
etc.Si vous aviez une
List
variable et que vous aviez besoin de savoir si c'était uneArrayList
, vous pouvez effectuer les opérations suivantes:Cependant, si vous pensez que vous devez le faire, vous voudrez peut-être repenser votre approche. Dans la plupart des cas, si vous suivez les principes orientés objet, vous n'aurez pas besoin de le faire. Il y a, bien sûr, des exceptions à chaque règle, cependant.
la source
En fait, il est assez facile de lancer votre propre testeur, en abusant de la capacité de surcharge de méthode de Java. Bien que je sois toujours curieux de savoir s'il existe une méthode officielle dans le SDK.
Exemple:
puis:
la source
a.getClass().getName()
- vous donnera le type de données de l'objet réel référencé para
, mais pas le type de données dans lequel la variable aa
été initialement déclarée ou vers laquelle il a été converti ultérieurement.boolean b = a instanceof String
- vous indiquera si l'objet réel auquel fait référencea
est une instance d'une classe spécifique. Encore une fois, le type de données dans lequel la variablea
a été déclarée à l'origine ou vers laquelle il a été converti par la suite n'a aucune incidence sur le résultat de l'opérateur instanceof.J'ai pris cette information de: Comment connaissez-vous un type de variable en java?
Cela peut arriver. J'essaie d'analyser un
String
dans un int et j'aimerais savoir si monInteger.parseInt(s.substring(a, b))
est en train de jeter un int ou une poubelle avant d'essayer de le résumer.Au fait, c'est ce qu'on appelle la réflexion. Voici quelques informations supplémentaires sur le sujet: http://docs.oracle.com/javase/tutorial/reflect/
la source
Vous pouvez travailler avec Integer au lieu de int, Double au lieu de double, etc. (de telles classes existent pour tous les types primitifs). Ensuite, vous pouvez utiliser l'opérateur instanceof, comme
if(var instanceof Integer){...}
la source
Utilisez simplement:
Exemple:
Production:
la source
randSB
détient NULL.Eh bien, je pense que la vérification du type de variable peut être effectuée de cette façon.
De cette façon, vous n'avez pas besoin d'avoir plusieurs méthodes surchargées. Je pense que c'est une bonne pratique d'utiliser des collections sur des tableaux en raison des avantages supplémentaires. Cela dit, je ne sais pas comment vérifier un type de tableau. Peut-être que quelqu'un peut améliorer cette solution. J'espère que cela t'aides!
PS Oui, je sais que cela ne vérifie pas non plus les primitives.
la source
La première partie de votre question n'a pas de sens. Il n'y a aucune circonstance dans laquelle vous ne connaissez pas le type d'une variable primitive au moment de la compilation.
Concernant la deuxième partie, la seule circonstance où vous ne savez pas déjà si une variable est un tableau est si c'est un objet. Dans ce cas
object.getClass().isArray()
, vous le direz.la source
Je l'ai fait en utilisant:
if(x.getClass() == MyClass.class){...}
la source
Je n'étais satisfait d'aucune de ces réponses, et celle qui est juste n'a pas d'explication et des votes négatifs, alors j'ai cherché, trouvé des choses et les ai modifiées pour qu'elles soient faciles à comprendre. Jouez avec, pas aussi simple qu'on pourrait l'espérer.
Voici une méthode:
la source
Aucune de ces réponses ne fonctionne si la variable est un type générique non initialisé
Et d'après ce que je peux trouver, ce n'est possible qu'en utilisant une solution de contournement extrêmement moche , ou en passant un paramètre initialisé à votre fonction, en le rendant en place, voir ici:
N'est PAS valide car vous ne pouvez pas extraire
T
directement le type du paramètre, car il est effacé au moment de l'exécution.Cela fonctionne car l'appelant est responsable de l'instanciation de la variable
out
avant l'appel. Cela lèvera toujours une exception si out est nul lorsqu'il est appelé, mais par rapport à la solution liée, c'est de loin le moyen le plus simple de le faireJe sais que c'est une sorte d'application spécifique, mais comme c'est le premier résultat sur google pour trouver le type d'une variable avec java (et étant donné qu'il
T
s'agit d'une sorte de variable), je pense qu'il devrait être inclusla source
Vous pouvez le vérifier facilement en utilisant
Java.lang.Class.getSimpleName()
Method Only si la variable a un type non primitif. Cela ne fonctionne pas avec les types primitifs int, long etc.reference - Voici le lien des documents Oracle
la source
En gros, par exemple:
la source
public class Demo1 {
}
la source