Quel est l'équivalent du C# 'var' mot-clé dans Java?
Une utilisation de la var mot-clé dans le C# est une déclaration de type implicite. Qu'est-ce que Java équivalent de la syntaxe pour var?
val
(ouvar
) si vous utilisez un particulier Java "remplacement" de la langue 😉- que serait Scala? Hm oui, il est.
- Pour l'Ide, j'ai présenté cela comme une demande de fonctionnalité: youtrack.jetbrains.com/issue/IDEA-102808 L'IDE pourrait s'effondrer le code pour afficher val ou le var, même si le code sous-jacent ne le pourrait pas.
- J'ai piraté quelque chose ensemble pour IntelliJ, voir mon répondre.
- Il n'y a pas encore de mot-clé var / inférence de type en Java 8, correct? leftoblique.net/wp/2013/07/25/...
- Il y a maintenant une proposition pour que cette fonctionnalité soit inclus dans Java - openjdk.java.net/jeps/286
- Peut-être que vous pouvez essayer de Kotlin kotlinlang.org beaucoup de parler de Kotlin. youtu.être/R0J_Jl7bKY8
- It la maintenant en vie.
Vous devez vous connecter pour publier un commentaire.
Il n'y a aucun. Hélas, vous devez taper le nom complet du type.
Edit: 7 ans après sa mise en place, l'inférence de type pour les variables locales (avec
var
) a été ajoutée dans Java 10.Edit: 6 ans après sa mise en place, afin de recueillir certains des commentaires ci-dessous:
La raison C# a la
var
mot-clé est parce que c'est possible d'avoir des Types qui n'ont pas de nom .NET. Par exemple:Dans ce cas, il serait impossible de donner un bon type de
myData
. Il y a 6 ans, c'était impossible en Java (tous les Types avaient des noms, même s'ils ont été extrêmement détaillé et unweildy). Je ne sais pas si cela a changé dans le temps de le dire.var
n'est pas le même quedynamic
.var
variables sont toujours 100% statiquement typé. Ce ne sera pas compiler:var
est également utile lorsque le type est évident à partir du contexte. Par exemple:Je peux dire que dans le code que je suis responsable,
currentUser
a unUser
ou de la classe dérivée en elle. Évidemment, si votre mise en œuvre deUser.GetCurrent
retourner un int, alors c'est peut-être un détriment pour vous.Cela n'a rien à voir avec
var
, mais si vous avez bizarre hiérarchies d'héritage où vous l'ombre des méthodes avec d'autres méthodes (par exemplenew public void DoAThing()
), n'oubliez pas que les non-méthodes virtuelles sont affectés par le Type qu'ils sont exprimés comme.Je ne peux pas imaginer un monde réel scénario où cela est révélateur d'une bonne conception, mais cela peut ne pas fonctionner comme prévu:
Comme indiqué, les méthodes virtuelles sont pas affectés par cette.
Non, il n'y a pas de non-être maladroit pour initialiser un
var
sans une variable réelle.Dans ce cas, il suffit de le faire à l'ancienne:
var
, qui ferait de Linq pratiquement inutilisable).var
mot-clé est 100% identiques à la déclaration d'une variable avec le type exact de l'expression. C'est tout.var p = new X(); p.Z()
n'est pas le même queSuperX p = new X(); p.Z()
pour tous X et et SuperX, même siX : SuperX
. Avecvar
le statique type dep
est toujoursX
dans le premier exemple ci-dessus, mais toujoursSuperX
dans le deuxième exemple. Un subtil mais la différence importante à connaître. Mais votre réponse est très correct 🙂var
ne pas rendre le code moins claire. Plutôt le contraire, à mon avis. Pourquoi, par exemple, écrire le type de deux (ou même trois) fois sur la même ligne lorsque vous déclarer et instancier (RadioButton radioButton = new RadioButton();
)?var
vous fait plutôt penser à deux fois lorsque vous nommer vos variables, car il transforme l'accent sur la fonctionnalité plutôt que le type (par exempleUserCollection collection = new userRepository.GetUsers();
plutôt plus naturellement se transforme envar users = userRepository.GetUsers();
). Si vous pensez quevar
est pas clair, c'est juste parce inutilisés à elle.RadioButton
radioButton
dans le cas d'une usine ou d'aide de la méthode où la seule chose importante sur le bouton que c'était unRadioButton
, sinon que c'est de la folie, avec ou sansvar
.var
que vous, si ce n'est plus, mais j'ai changé d'avis, et c'est peut-être aussi simple que d'une question d'opinions différentes, parce que je pense que vous vous trompez quand vous dites que c'est une question de combien vous utilisez des objets anonymes et génériques 😉 La déclaration de type est le plus souvent qu'un code de bruit, si vous ne pouvez pas comprendre le code sans le code est probablement pas clair dans les deux cas.? x = a.CompareTo(b);
enint x = a.CompareTo(b);
et ainsi de suite, ce qui est le plus proche que nous pourrions avoir àvar
sans support de la langue. J'ai donc été à l'aide devar
avant il y avaitvar
.var
lui-même, qu'il demande au compilateur de déduire le type de la mission; c'est du sucre syntaxique. J'étais sceptique au début, mais je l'utilise religieusement et n'ont pas encore rencontre un moment où il a causé de la confusion. Il supprime la redondance lors de l'instanciation et supprime la nécessité de vérifier le type de référencement. Il n'y a pas de JAVA équivalent de JAVA 9.Si vous ajoutez de Lombok à votre projet, vous pouvez utiliser ses val mot-clé.
http://projectlombok.org/features/val.html
final
ne sont pas nécessairement immuable. Envisagerfinal StringBuilder strB = new StringBuilder("My reference is final"); strB.append("I'm not immutable");
var
. projectlombok.org/features/experimental/var.htmlJEP - JDK mise en valeur de Proposition
http://openjdk.java.net/jeps/286
JEP 286: Local Variable de l'Inférence de Type
Auteur Brian Goetz
J'ai concocté un plugin pour IntelliJ qui – un vous donne
var
en Java. C'est un hack, de sorte que les avertissements habituels s'appliquent, mais si vous utilisez l'Ide pour votre développement Java et que vous souhaitez essayer, c'est à https://bitbucket.org/balpha/varsity.Avec la version de JDK 10, le 20 Mars, Java inclut maintenant un
var
réservés nom de type (pas un mot-clé—voir ci-dessous), comme spécifié dans JEP 286. Pour les variables locales, la suite est maintenant valide en Java 10 ou plus:La
var
réservés nom de type de Java est presque identique à lavar
mot-clé en C# dans qui permettent à la fois pour le typage implicite (voir ci-dessous les différences).var
en Java peut être utilisé uniquement pour les implicites de l'inférence de type dans les contextes suivants (tels qu'énumérés dans JEP 286: Objectifs):Donc
var
ne peut pas être utilisé pour les champs, les types de retour, les noms de classe, ou les noms d'interface. Sa raison d'être est de supprimer la nécessité, y compris pour les longs noms de type lors de la déclaration et la définition des variables locales, comme indiqué dans JEP 286 (rédigé par Brian Goetz):var
La portée dans JavaIl convient de noter que
var
n'est pas un mot-clé en Java, mais plutôt réservé un nom de type. Comme cité de PEC 286:Noter que depuis
var
réservé de nom de type et pas un mot clé, il peut encore être utilisé pour les noms de paquets, les noms de méthode, et les noms de variables (avec son nouveau type d'interférence rôle). Par exemple, les suivants sont tous des exemples d'utilisations valides devar
en Java:Comme cité de PEC 286:
Différences Entre
var
en Java & C#C'est une différence notable entre
var
en C# et Java sont les suivants:var
peut être utilisé comme un nom de type en C#, mais ne peut pas être utilisé comme un nom de classe ou le nom de l'interface en Java. Selon le C# documentation (Implicitement Tapé Variables Locales):La possibilité d'utiliser
var
comme un nom de type en C# crée une certaine complexité et introduit une sorte de complexe de résolution de règles, qui sont évités parvar
en Java en interdisantvar
comme une classe ou une interface de nom. Pour plus d'informations sur les complexités devar
noms de type en C#, voir Des Restrictions s'appliquent aux implicitement tapé les déclarations de variables. Pour plus d'informations sur la justification de la détermination de la portée de la décision de la var en Java, voir JEP 286: Portée Choix.var
pour les champs ou les types de retour? Pourquoi est-il important de noter?var
en Java ne peut pas être utilisé pour les champs ou les types de retour. Ceci est important parce que cette restriction rendvar
sensible au contexte, d'où il ne peut être utilisé dans certains contextes (variables locales) et pas d'autres. Ce n'est pas nécessairement une différence entre Java et C# qui doit être noté, mais une importante restriction en général lors de l'utilisation devar
en Java.var
un nom de classe et à l'utiliser comme tel. Techniquement, c'est un "contexte" de mot-clé dans le cas de c#, mais en Java, il semble que vous ne pouvez pas faire la même chose. Corrigez-moi si je me trompe.var
comme un nom de classe ou un nom d'interface en Java (qui n'est pas commun en tout cas), mais vous pouvez l'utiliser pour les noms de variables, les noms de méthode, et les noms de paquets. Par exemple,var var = 1;
est valide Java déclaration, mais en essayant de déclarer une classe commepublic class var {}
conduit à une erreur:as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations
. J'ai mis à jour la réponse ci-dessus pour aller plus en détail sur la justification devar
en Java et ses différences avecvar
en C#.Il sera pris en charge dans le JDK 10. Il est même possible de le voir en action dans la l'accès anticipé à construire.
La JEP 286:
Alors maintenant, au lieu d'écrire:
Vous écrivez:
Notes:
var
est maintenant un réservés nom du typeSi vous voulez l'essayer sans installer Java sur votre système local, j'ai créé un Docker image avec JDK 10 sont installés:
var
) n'est pas équivalent. Dans levar
exemplelist
est de typeArrayList
, pas unList
.Une solution simple (en supposant que vous utilisez un décent IDE) est de type 'int' partout et obtenir ensuite à définir le type pour vous.
En fait je viens de rajouter une classe appelée 'var' donc je n'ai pas à taper quelque chose de différent.
Le code est encore trop verbeux, mais au moins vous n'avez pas à taper!
int
) -- ai-je raté quelque chose? (*: bien que je n'aurais jamais Eclipse décent IDE, je ne peux pas juger pour les autres...)Vous pouvez prendre un coup d'oeil à Kotlin par JetBrains, mais c'est val. pas var.
Java 10 obtenir la variable locale de l'inférence de type, alors maintenant, il a
var
qui est à peu près équivalent à la C# (aussi loin que je suis au courant).Il peut également en déduire la non-denotable types (types qui ne pouvait pas être nommé dans cet endroit par le programmeur; si qui types sont non-denotable est différent, par exemple, Java n'est pas un équivalent en C# les types anonymes).
La seule différence que j'ai pu trouver est qu'en C#,
En Java 10
var
n'est pas un nom de type.Je sais que c'est vieux, mais pourquoi ne pas créer une variable de classe et de créer les constructeurs avec différents types et en fonction de ce que les constructeurs est appelé vous obtenez var avec différents type. Vous pouvez même construire dans des méthodes de conversion d'un type à l'autre.
Lombok
prend en charge var mais il est toujours classé comme expérimentale:Ici est un piège à éviter lorsque vous essayez de l'utiliser dans
IntelliJ IDEA
. Il semble fonctionner comme prévu même si, y compris l'auto-complétion et tout et tout. Jusqu'à il y a un "non-hacky" solution (par exemple en raison de JEP 286: Local Variable de l'Inférence de Type), cela pourrait être votre meilleur pari droit maintenant.Noter que
val
est support parLombok
ainsi sans modification ou la création d'unlombok.config
.De Java 10, l'équivalent est ...
var
.Vous pouvez, en Java 10, mais seulement pour Local variables, de sens, de
Vous pouvez,
var anum = 10; var aString = "Var";
Mais ne peut pas,
var anull = null; //Since the type can't be inferred in this case
Découvrez la spec pour plus d'info.
var
peut être utilisé pour de nombreuses formes de non-denotable types, y compris la capture types, à l'intersection des types et des types de classe. Et, comme de Java 11, il peut également être appliqué à lambda paramètres.En général, vous pouvez utiliser la classe d'Objet pour n'importe quel type, mais vous devez faire de ce type de casting plus tard!
par exemple:-
var
mot maintenant officiellement dans la langue, votre réponse est aussi en se référant à l'ancienne.Cette fonctionnalité est désormais disponible en Java SE 10. La statique, type-safe var a finalement fait dans le monde java 🙂
source: https://www.oracle.com/corporate/pressrelease/Java-10-032018.html