val(ou var) se você usa uma linguagem "Java de substituição" específica ;-) #
6
@ pst: isso seria Scala? Hum, é sim.
rsenna
Para o IntelliJ, enviei isso como uma solicitação de recurso: youtrack.jetbrains.com/issue/IDEA-102808 O IDE poderia recolher o código para mostrar val ou var, mesmo que o código subjacente não o tivesse.
Jon Onstott
@ Jon hackeei algo juntos para IntelliJ, veja minha resposta .
Não há nenhum. Infelizmente, você precisa digitar o nome completo do tipo.
Edit: 7 anos após o lançamento, a inferência de tipo para variáveis locais (com var) foi adicionada no Java 10.
Editar: 6 anos após a publicação, para coletar alguns dos comentários abaixo:
O motivo pelo qual C # tem a varpalavra-chave é que é possível ter tipos que não têm nome no .NET. Por exemplo:
var myData =new{ a =1, b ="2"};
Nesse caso, seria impossível atribuir um tipo adequado myData. Há 6 anos, isso era impossível em Java (todos os tipos tinham nomes, mesmo que fossem extremamente detalhados e pouco controlados). Não sei se isso mudou nesse meio tempo.
varnão é o mesmo que dynamic. varOs dados ainda são 100% digitados estaticamente. Isso não será compilado:
var myString ="foo";
myString =3;
vartambém é útil quando o tipo é óbvio no contexto. Por exemplo:
var currentUser =User.GetCurrent();
Posso dizer que em qualquer código pelo qual sou responsável, currentUserhá uma Userclasse ou classe derivada. Obviamente, se sua implementação de User.GetCurrentretornar um int, talvez isso seja um prejuízo para você.
Isso não tem nada a ver com isso var, mas se você tiver hierarquias de herança estranhas nas quais sombreia métodos com outros métodos (por exemplo new public void DoAThing()), não esqueça que métodos não virtuais são afetados pelo tipo em que são convertidos.
Não consigo imaginar um cenário do mundo real em que isso seja indicativo de bom design, mas isso pode não funcionar como o esperado:
classFoo{publicvoidNon(){}public virtual voidVirt(){}}classBar:Foo{publicnewvoidNon(){}public override voidVirt(){}}classBaz{publicstaticFooGetFoo(){returnnewBar();}}
var foo =Baz.GetFoo();
foo.Non();// <- Foo.Non, not Bar.Non
foo.Virt();// <- Bar.Virt
var bar =(Bar)foo;
bar.Non();// <- Bar.Non, not Foo.Non
bar.Virt();// <- Still Bar.Virt
Como indicado, os métodos virtuais não são afetados por isso.
Não, não há uma maneira não desajeitada de inicializar a varsem uma variável real.
var foo1 ="bar";//good
var foo2;//bad, what type?
var foo3 =null;//bad, null doesn't have a type
var foo4 =default(var);//what?
var foo5 =(object)null;//legal, but go home, you're drunk
@ Mike Caron: C # tem [padrão] chamadas não virtuais e os operadores não são virtuais, portanto ... var p = new X(); p.Z()não é o mesmo que SuperX p = new X(); p.Z()para todos os X e SuperX, apesar de tudo X : SuperX. Com varo tipo estático,p está sempre Xno primeiro exemplo acima, mas sempre SuperXno segundo exemplo. Uma diferença sutil, mas importante, para estar ciente. Mas a sua resposta está muito correta :-) #
200
@ Jon Hanna: varnão torna o código menos claro. Pelo contrário, na minha opinião. Por que, por exemplo, escreva o tipo duas (ou até três) vezes na mesma linha quando você a declara e a instancia ( RadioButton radioButton = new RadioButton();)? varfaz com que você pense duas vezes ao nomear suas variáveis, porque ele se concentra mais na funcionalidade do que no tipo (por exemplo, UserCollection collection = new userRepository.GetUsers();mais naturalmente se transforma var users = userRepository.GetUsers();). Se você acha que varnão está claro, é porque não está acostumado.
Martin Odhelius
4
Definitivamente, o @MartinOdhelius varpode deixar bem claro o código usado, mas também pode deixar claro o mau uso; como muitas opções de formatação. O saldo varia de acordo com o quanto você usa objetos e genéricos anônimos, nenhum dos quais existia no .NET 1.0, tornando-o menos útil como uma palavra-chave hipotética na primeira versão do C♯. Eu nomearia apenas a RadioButtonradioButtonno caso de um método de fábrica ou auxiliar, onde a única coisa significativa sobre o botão era que era um RadioButton, caso contrário, isso é loucura com ou sem var.
Jon Hanna
6
@ Jon Hanna: Eu já fui tão crítico varquanto você, se não mais, mas mudei de opinião, e talvez seja tão simples quanto uma questão de opiniões diferentes, porque ainda acho que você está errado quando diz que é um não importa o quanto você esteja usando objetos e genéricos anônimos;) A declaração de tipo geralmente é apenas um ruído de código; se você não conseguir entender o código sem ele, o código provavelmente não será claro nos dois casos.
Martin Odhelius
3
Você está confundindo var com tipos anônimos . varele próprio simplesmente pede ao compilador para inferir o tipo da atribuição; é açúcar sintático. Eu era cético a princípio, mas o uso religiosamente e ainda tenho que encontrar um momento em que isso causou confusão. Remove a redundância ao instanciar e remove a necessidade de verificar o tipo ao fazer referência. Não há equivalente JAVA como de JAVA 9.
Robear
46
Se você adicionar o Lombok ao seu projeto, poderá usar a palavra-chave val .
@ rightfold: Objetos cuja referência é finalnão são necessariamente imutáveis. Considerefinal StringBuilder strB = new StringBuilder("My reference is final"); strB.append("I'm not immutable");
@MatthiasBraun, seu exemplo está errado. Nesse caso, a própria classe StringBuilder é imutável; você apenas adiciona valor da string à sua estrutura interna usando o método, isso é totalmente legal.
@PeterMortensen Sim. O JEP 286 foi aceito e publicado no JDK 10 (consulte 286 em Recursos em openjdk.java.net/projects/jdk/10 ).
Justin Albano
20
Eu criei um plugin para o IntelliJ que, de certa forma, fornece a você varem Java. É um hack, então as isenções de responsabilidade usuais se aplicam, mas se você usa o IntelliJ para o seu desenvolvimento Java e deseja experimentá-lo, é em https://bitbucket.org/balpha/varsity .
Seria ótimo ter um atalho de teclado para dobrar / desdobrar tipos de declaração no editor atual. Ótimo plugin embora.
hotkey
2
@hotkey Utiliza a dobra de código interna do IntelliJ, para que você possa desdobrar tudo com o Ctrl-Shift-NumPadPlus. Quando o cursor está em uma linha que contém uma declaração de variável dobrada, você pode Ctrl-NumPadPlus e Ctrl-NumPadMinus para dobrar / desdobrar as declarações no método atual. Dobrar todas as declarações é um pouco estranho, você dobra tudo (Ctrl-Shift-NumPadMinus) e desdobra tudo novamente (Ctrl-Shift-NumPadPlus).
balpha
18
Com o lançamento do JDK 10 em 20 de março, o Java agora inclui um varnome de tipo reservado (não uma palavra-chave - veja abaixo), conforme especificado no JEP 286 . Para variáveis locais, o seguinte agora é válido no Java 10 ou superior:
var map =newHashMap<String,Integer>();
O varnome do tipo reservado em Java é quase idêntico à varpalavra - chave em C #, pois ambos permitem digitação implícita (veja abaixo diferenças importantes). varem Java pode ser usado apenas para inferência implícita de tipo nos seguintes contextos (conforme enumerado no JEP 286: Objetivos ):
variáveis locais com inicializadores
índices no loop for aprimorado
locais declarados em um loop for tradicional
Portanto, varnão pode ser usado para campos, tipos de retorno, nomes de classe ou nomes de interface. Sua lógica é remover a necessidade de incluir nomes de tipo longos ao declarar e definir variáveis locais, conforme declarado no JEP 286 (de autoria de Brian Goetz):
Procuramos melhorar a experiência do desenvolvedor, reduzindo a cerimônia associada à escrita do código Java, mantendo o compromisso do Java com a segurança de tipo estático, permitindo que os desenvolvedores excluam a declaração manifesta muitas vezes desnecessária dos tipos de variáveis locais.
var Escopo em Java
Note-se que varnão é uma palavra-chave em Java, mas um nome de tipo reservado. Conforme citado no JEP 286:
O identificador var não é uma palavra-chave; em vez disso, é um nome de tipo reservado. Isso significa que o código que usa var como uma variável, método ou nome do pacote não será afetado; o código que usa var como nome de classe ou interface será afetado (mas na prática esses nomes são raros, pois violam as convenções de nomenclatura comuns).
Observe que, como varé um nome de tipo reservado e não uma palavra-chave, ele ainda pode ser usado para nomes de pacotes, nomes de métodos e nomes de variáveis (junto com sua nova função de interferência de tipo). Por exemplo, todos os exemplos a seguir são de usos válidos varem Java:
var i =0;
var var =1;for(var i =0; i <10; i++){/* ... */}publicint var(){return0;}package var;
Conforme citado no JEP 286:
Esse tratamento seria restrito a variáveis locais com inicializadores, índices no loop for aprimorado e locais declarados em um loop for tradicional; não estaria disponível para formals de método, formals de construtor, tipos de retorno de método, campos, formals de captura ou qualquer outro tipo de declaração de variável.
Diferenças entre varem Java e C
Essa é uma diferença notável entre varC # e Java: o varpode ser usado como um nome de tipo em C #, mas não pode ser usado como um nome de classe ou de interface em Java. De acordo com a documentação do C # (variáveis locais implicitamente digitadas) :
Se um tipo nomeado varestiver no escopo, a varpalavra - chave será resolvida com esse nome de tipo e não será tratada como parte de uma declaração de variável local digitada implicitamente.
A capacidade de usar varcomo um nome de tipo em C # cria alguma complexidade e introduz algumas regras complexas de resolução, que são evitadas varno Java ao proibir varcomo nome de classe ou interface. Para obter informações sobre as complexidades dos varnomes de tipos em C #, consulte Restrições se aplicam a declarações de variáveis de tipo implícito . Para obter mais informações sobre a lógica por trás da decisão de escopo para `var em Java, consulte JEP 286: Opções de Escopo .
Existe alguma diferença entre Java e c # em que você não pode usar varcampos ou tipos de retorno? Por que é importante notar?
precisa saber é o seguinte
@ user1306322 Nesse contexto, não. varem Java não pode ser usado para campos ou tipos de retorno. Isso é importante porque essa restrição torna varsensível ao contexto, onde só pode ser usada em alguns contextos (variáveis locais) e não em outros. Essa não é necessariamente uma diferença entre Java e C # que deve ser observada, mas uma restrição importante em geral quando usada varem Java.
23630 Justin Albano
Eu apenas olhei para cima e parece que em c # você pode criar varum nome de classe e usá-lo como tal. Tecnicamente, é uma "palavra-chave de contexto" no caso de c #, mas em Java parece que você não pode fazer o mesmo. Corrija-me se eu estiver errado.
precisa saber é o seguinte
1
Você está certo. Você não pode usar varcomo um nome de classe ou um nome de interface em Java (o que não é comum de qualquer maneira), mas pode ser usado para nomes de variáveis, nomes de métodos e nomes de pacotes. Por exemplo, var var = 1;é uma declaração Java válido, mas tentando declarar uma classe como public class var {}resulta em um erro: as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations. Atualizei a resposta acima para entrar em mais detalhes sobre a lógica por trás vardo Java e suas diferenças com o varC #.
Java ainda está comprometido com a digitação estática!
Só pode ser usado em declarações de variáveis locais
Se você quiser experimentá-lo sem instalar o Java em seu sistema local, criei uma imagem do Docker com o JDK 10 instalado:
$ docker run -it marounbassam/ubuntu-java10 bash
root@299d86f1c39a:/# jdk-10/bin/jshell
Mar30,20189:07:07 PM java.util.prefs.FileSystemPreferences$1 run
INFO:Created user preferences directory.|Welcome to JShell--Version10|For an introduction type:/help intro
jshell> var list =newArrayList<String>();
list ==>[]
Quando você diz "IDE decente", o Eclipse * é excluído? - isso não parece funcionar em Luna (pelo menos quando eu tentei int) - estou perdendo alguma coisa? (*: Embora eu nunca chamaria Eclipse uma IDE decente, não posso julgar por outros ...)
BrainSlugs83
@ BrainSlugs83 não sei Eu estou usando o IDEA, realmente não usei o eclipse antes. Não corrige tipos para você? Estou acostumado a c # / visual studio / resharper, que é como o IDEA, exceto que realmente funciona corretamente! Em todos os jetbrains, você pode pressionar alt-enter para obter uma lista de sugestões quando houver um erro - portanto, definir type para int introduz um erro que você pode pressionar alt-enter e ordená-lo para classificar o tipo
JonnyRaa
5
Você pode dar uma olhada no Kotlin by JetBrains, mas é val. não var.
Existem quaisquer diferenças? Quero dizer, você sabe que não deve escrever respostas curtas como esta, com o seu nível de representante em todos. E certamente deve haver algumas diferenças.
precisa saber é o seguinte
@ user1306322 Essa é uma pergunta totalmente separada! Você pode verificar a tag java-10, pois muitos aspectos já foram solicitados.
Brian Goetz
Bem, esta é a questão a ser examinada se você pesquisar no Google, pois ele vem primeiro e está vinculado a todas as postagens relacionadas na barra lateral. Portanto, suponho que, se você conhece uma pergunta separada que a responde, você pode pelo menos vincular-se a ela ou incluir partes dela em sua resposta.
precisa saber é o seguinte
3
Eu sei que isso é mais antigo, mas por que não criar uma classe var e criar construtores com tipos diferentes e dependendo de quais construtores são chamados, você obtém var com tipos diferentes. Você pode até criar métodos para converter um tipo em outro.
import lombok.experimental.var;
var number =1;// Inferred type: int
number =2;// Legal reassign since var is not final
number ="Hi";// Compilation error since a string cannot be assigned to an int variableSystem.out.println(number);
Aqui está uma armadilha a evitar ao tentar usá-lo IntelliJ IDEA. Parece funcionar como esperado, incluindo a conclusão automática e tudo mais. Até que exista uma solução "não-hacky" (por exemplo, devido ao JEP 286: Inferência de tipo de variável local ), essa pode ser sua melhor aposta agora.
Observe que também valé Lomboksuportado sem modificar ou criar um lombok.config.
Isto está incorreto. varpode ser usado para muitas formas de tipos não denotáveis, incluindo tipos de captura, tipos de interseção e tipos de classe anônimos. E, a partir do Java 11, também pode ser aplicado aos parâmetros lambda.
Brian Goetz
0
Em geral, você pode usar a classe Object para qualquer tipo, mas pode fazer a conversão de tipo mais tarde!
Aditya, verifique todas as suas outras respostas. Muitos deles têm -1 e provavelmente por um bom motivo. Não poste apenas o que quiser, se não tiver certeza de que está correto.
precisa saber é o seguinte
@ user1306322 qual é o problema na minha resposta! você pode elaborar? não podemos usar a classe Object para todos os tipos de dados?
O problema é que você não entendeu a pergunta. A questão não era "como fazer isso funcionar", mas "existe algo assim". Você responde a pergunta errada. Com a varpalavra agora oficialmente no idioma, sua resposta também se refere à maneira antiquada.
precisa saber é o seguinte
-1
Agora, esse recurso está disponível no Java SE 10. O var estático, com segurança de tipo, finalmente chegou ao mundo java :)
val
(ouvar
) se você usa uma linguagem "Java de substituição" específica ;-) #Respostas:
Não há nenhum. Infelizmente, você precisa digitar o nome completo do tipo.
Edit: 7 anos após o lançamento, a inferência de tipo para variáveis locais (com
var
) foi adicionada no Java 10.Editar: 6 anos após a publicação, para coletar alguns dos comentários abaixo:
O motivo pelo qual C # tem a
var
palavra-chave é que é possível ter tipos que não têm nome no .NET. Por exemplo:Nesse caso, seria impossível atribuir um tipo adequado
myData
. Há 6 anos, isso era impossível em Java (todos os tipos tinham nomes, mesmo que fossem extremamente detalhados e pouco controlados). Não sei se isso mudou nesse meio tempo.var
não é o mesmo quedynamic
.var
Os dados ainda são 100% digitados estaticamente. Isso não será compilado:var
também é útil quando o tipo é óbvio no contexto. Por exemplo:Posso dizer que em qualquer código pelo qual sou responsável,
currentUser
há umaUser
classe ou classe derivada. Obviamente, se sua implementação deUser.GetCurrent
retornar um int, talvez isso seja um prejuízo para você.Isso não tem nada a ver com isso
var
, mas se você tiver hierarquias de herança estranhas nas quais sombreia métodos com outros métodos (por exemplonew public void DoAThing()
), não esqueça que métodos não virtuais são afetados pelo tipo em que são convertidos.Não consigo imaginar um cenário do mundo real em que isso seja indicativo de bom design, mas isso pode não funcionar como o esperado:
Como indicado, os métodos virtuais não são afetados por isso.
Não, não há uma maneira não desajeitada de inicializar a
var
sem uma variável real.Nesse caso, faça da maneira antiga:
fonte
var p = new X(); p.Z()
não é o mesmo queSuperX p = new X(); p.Z()
para todos os X e SuperX, apesar de tudoX : SuperX
. Comvar
o tipo estático,p
está sempreX
no primeiro exemplo acima, mas sempreSuperX
no segundo exemplo. Uma diferença sutil, mas importante, para estar ciente. Mas a sua resposta está muito correta :-) #var
não torna o código menos claro. Pelo contrário, na minha opinião. Por que, por exemplo, escreva o tipo duas (ou até três) vezes na mesma linha quando você a declara e a instancia (RadioButton radioButton = new RadioButton();
)?var
faz com que você pense duas vezes ao nomear suas variáveis, porque ele se concentra mais na funcionalidade do que no tipo (por exemplo,UserCollection collection = new userRepository.GetUsers();
mais naturalmente se transformavar users = userRepository.GetUsers();
). Se você acha quevar
não está claro, é porque não está acostumado.var
pode deixar bem claro o código usado, mas também pode deixar claro o mau uso; como muitas opções de formatação. O saldo varia de acordo com o quanto você usa objetos e genéricos anônimos, nenhum dos quais existia no .NET 1.0, tornando-o menos útil como uma palavra-chave hipotética na primeira versão do C♯. Eu nomearia apenas aRadioButton
radioButton
no caso de um método de fábrica ou auxiliar, onde a única coisa significativa sobre o botão era que era umRadioButton
, caso contrário, isso é loucura com ou semvar
.var
quanto você, se não mais, mas mudei de opinião, e talvez seja tão simples quanto uma questão de opiniões diferentes, porque ainda acho que você está errado quando diz que é um não importa o quanto você esteja usando objetos e genéricos anônimos;) A declaração de tipo geralmente é apenas um ruído de código; se você não conseguir entender o código sem ele, o código provavelmente não será claro nos dois casos.var
ele próprio simplesmente pede ao compilador para inferir o tipo da atribuição; é açúcar sintático. Eu era cético a princípio, mas o uso religiosamente e ainda tenho que encontrar um momento em que isso causou confusão. Remove a redundância ao instanciar e remove a necessidade de verificar o tipo ao fazer referência. Não há equivalente JAVA como de JAVA 9.Se você adicionar o Lombok ao seu projeto, poderá usar a palavra-chave val .
http://projectlombok.org/features/val.html
fonte
final
não são necessariamente imutáveis. Considerefinal StringBuilder strB = new StringBuilder("My reference is final"); strB.append("I'm not immutable");
var
. projectlombok.org/features/experimental/var.htmlJEP - Proposta de aprimoramento do JDK
http://openjdk.java.net/jeps/286
JEP 286: Inferência de tipo variável local
Autor Brian Goetz
fonte
Eu criei um plugin para o IntelliJ que, de certa forma, fornece a você
var
em Java. É um hack, então as isenções de responsabilidade usuais se aplicam, mas se você usa o IntelliJ para o seu desenvolvimento Java e deseja experimentá-lo, é em https://bitbucket.org/balpha/varsity .fonte
Com o lançamento do JDK 10 em 20 de março, o Java agora inclui um
var
nome de tipo reservado (não uma palavra-chave - veja abaixo), conforme especificado no JEP 286 . Para variáveis locais, o seguinte agora é válido no Java 10 ou superior:O
var
nome do tipo reservado em Java é quase idêntico àvar
palavra - chave em C #, pois ambos permitem digitação implícita (veja abaixo diferenças importantes).var
em Java pode ser usado apenas para inferência implícita de tipo nos seguintes contextos (conforme enumerado no JEP 286: Objetivos ):Portanto,
var
não pode ser usado para campos, tipos de retorno, nomes de classe ou nomes de interface. Sua lógica é remover a necessidade de incluir nomes de tipo longos ao declarar e definir variáveis locais, conforme declarado no JEP 286 (de autoria de Brian Goetz):var
Escopo em JavaNote-se que
var
não é uma palavra-chave em Java, mas um nome de tipo reservado. Conforme citado no JEP 286:Observe que, como
var
é um nome de tipo reservado e não uma palavra-chave, ele ainda pode ser usado para nomes de pacotes, nomes de métodos e nomes de variáveis (junto com sua nova função de interferência de tipo). Por exemplo, todos os exemplos a seguir são de usos válidosvar
em Java:Conforme citado no JEP 286:
Diferenças entre
var
em Java e CEssa é uma diferença notável entre
var
C # e Java: ovar
pode ser usado como um nome de tipo em C #, mas não pode ser usado como um nome de classe ou de interface em Java. De acordo com a documentação do C # (variáveis locais implicitamente digitadas) :A capacidade de usar
var
como um nome de tipo em C # cria alguma complexidade e introduz algumas regras complexas de resolução, que são evitadasvar
no Java ao proibirvar
como nome de classe ou interface. Para obter informações sobre as complexidades dosvar
nomes de tipos em C #, consulte Restrições se aplicam a declarações de variáveis de tipo implícito . Para obter mais informações sobre a lógica por trás da decisão de escopo para `var em Java, consulte JEP 286: Opções de Escopo .fonte
var
campos ou tipos de retorno? Por que é importante notar?var
em Java não pode ser usado para campos ou tipos de retorno. Isso é importante porque essa restrição tornavar
sensível ao contexto, onde só pode ser usada em alguns contextos (variáveis locais) e não em outros. Essa não é necessariamente uma diferença entre Java e C # que deve ser observada, mas uma restrição importante em geral quando usadavar
em Java.var
um nome de classe e usá-lo como tal. Tecnicamente, é uma "palavra-chave de contexto" no caso de c #, mas em Java parece que você não pode fazer o mesmo. Corrija-me se eu estiver errado.var
como um nome de classe ou um nome de interface em Java (o que não é comum de qualquer maneira), mas pode ser usado para nomes de variáveis, nomes de métodos e nomes de pacotes. Por exemplo,var var = 1;
é uma declaração Java válido, mas tentando declarar uma classe comopublic class var {}
resulta em um erro:as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations
. Atualizei a resposta acima para entrar em mais detalhes sobre a lógica por trásvar
do Java e suas diferenças com ovar
C #.Ele será suportado no JDK 10. É ainda possível vê-lo em ação na compilação de acesso antecipado .
O JEP 286 :
Então agora, em vez de escrever:
Você escreve:
Notas:
var
agora é um nome de tipo reservadoSe você quiser experimentá-lo sem instalar o Java em seu sistema local, criei uma imagem do Docker com o JDK 10 instalado:
fonte
var
) não é equivalente. Novar
exemplolist
é do tipoArrayList
, não aList
.Uma solução simples (supondo que você esteja usando um IDE decente) é apenas digitar 'int' em todos os lugares e depois definir o tipo para você.
Na verdade, acabei de adicionar uma classe chamada 'var' para não precisar digitar algo diferente.
O código ainda é muito detalhado, mas pelo menos você não precisa digitá-lo!
fonte
int
) - estou perdendo alguma coisa? (*: Embora eu nunca chamaria Eclipse uma IDE decente, não posso julgar por outros ...)Você pode dar uma olhada no Kotlin by JetBrains, mas é val. não var.
fonte
O Java 10 obteve inferência de tipo de variável local, agora ele possui
var
praticamente o equivalente ao C # one (tanto quanto sei).Também pode inferir tipos não denotáveis (tipos que não puderam ser nomeados nesse local pelo programador; apesar de que tipos não denotáveis são diferentes). Veja, por exemplo, Truques com
var
classes anônimas (que você nunca deve usar no trabalho) .A única diferença que pude encontrar é que em C #,
No Java 10
var
não é um nome de tipo legal.fonte
A partir de Java 10, o equivalente é ...
var
.fonte
Eu sei que isso é mais antigo, mas por que não criar uma classe var e criar construtores com tipos diferentes e dependendo de quais construtores são chamados, você obtém var com tipos diferentes. Você pode até criar métodos para converter um tipo em outro.
fonte
Lombok
suporta var, mas ainda é classificado como experimental:Aqui está uma armadilha a evitar ao tentar usá-lo
IntelliJ IDEA
. Parece funcionar como esperado, incluindo a conclusão automática e tudo mais. Até que exista uma solução "não-hacky" (por exemplo, devido ao JEP 286: Inferência de tipo de variável local ), essa pode ser sua melhor aposta agora.Observe que também
val
éLombok
suportado sem modificar ou criar umlombok.config
.fonte
Você pode, no Java 10, mas apenas para variáveis locais , significando,
Você pode,
var anum = 10; var aString = "Var";
Mas não pode,
var anull = null; // Since the type can't be inferred in this case
Confira as especificações para mais informações.
fonte
var
pode ser usado para muitas formas de tipos não denotáveis, incluindo tipos de captura, tipos de interseção e tipos de classe anônimos. E, a partir do Java 11, também pode ser aplicado aos parâmetros lambda.Em geral, você pode usar a classe Object para qualquer tipo, mas pode fazer a conversão de tipo mais tarde!
por exemplo:-
fonte
var
palavra agora oficialmente no idioma, sua resposta também se refere à maneira antiquada.Agora, esse recurso está disponível no Java SE 10. O var estático, com segurança de tipo, finalmente chegou ao mundo java :)
fonte: https://www.oracle.com/corporate/pressrelease/Java-10-032018.html
fonte