Un uso de la palabra clave var en C# es una declaración de tipo implícita. ¿Cuál es la sintaxis equivalente de Java para var?¿Cuál es el equivalente de la palabra clave 'var' de C# en Java?
Respuesta
No hay ninguno. Por desgracia, tienes que escribir el nombre completo.
Editar 6 años después de haber sido publicado, para recoger algunos de los comentarios de abajo:
La razón C# tiene la palabra clave
var
se debe a que es posible tener tipos que no tienen nombre en .NET. Por ejemplo:var myData = new { a = 1, b = "2" };
En este caso, sería imposible dar un tipo adecuado para
myData
. Hace 6 años, esto era imposible en Java (todos los tipos tenían nombres, incluso si eran extremadamente detallados y poco sofisticados). No sé si esto ha cambiado mientras tanto.var
no es lo mismo quedynamic
.var
Iiables todavía están 100% estáticamente tipados. Esto no va a compilar:var myString = "foo"; myString = 3;
var
también es útil cuando el tipo es evidente a partir del contexto. Por ejemplo:var currentUser = User.GetCurrent();
me puede decir que en cualquier código que soy responsable de,
currentUser
tiene una claseUser
o que se derivan de ella. Obviamente, si su implementación deUser.GetCurrent
devuelve un int, entonces tal vez esto sea perjudicial para usted.Esto no tiene nada que ver con
var
, pero si usted tiene jerarquías de herencia extraños donde remedar métodos con otros métodos (por ejemplonew public void DoAThing()
), no se olvide que los métodos no virtuales se ven afectados por el tipo que se presentan como .no puedo imaginar un escenario real mundo donde esto es indicativo de un buen diseño, pero esto puede no funcionar como se esperaba:
class Foo { public void Non() {} public virtual void Virt() {} } class Bar : Foo { public new void Non() {} public override void Virt() {} } class Baz { public static Foo GetFoo() { return new Bar(); } } 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 se ha indicado, los métodos virtuales no se ven afectados por esto.
No, no hay una forma no torpe de inicializar un
var
sin una variable 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
En este caso, basta con hacerlo de la manera antigua:
object foo6;
Y para ser justos también; 1. solo es reciente en C#, por lo que Arturo no puede culpar a los "creadores" y 2. solo se debe a otras características que no estaban en el 1.0 de ninguno de los dos idiomas, que se convierta en una idea que es útil en lugar de una gran forma de hacer código menos claro y más propenso a errores. Es necesario en C# 3.0, y tendría algunos casos útiles en C# 2.0, pero hubiera sido algo malo en C# 1.0. –
@Mike Caron: y debido a ciertos tipos muy largos (sin 'var', eso haría a Linq prácticamente inutilizable). – rsenna
@pst ¿Qué tiene que ver la tipificación implícita con el polimorfismo? La palabra clave 'var' es 100% idéntica a la declaración de una variable con el tipo exacto de la expresión. Eso es todo. –
Si se agrega a su proyecto Lombok puedes es val palabra clave.
@rightfold: Objetos cuya referencia es 'final' no son necesariamente inmutables. Considere 'final StringBuilder strB = new StringBuilder (" Mi referencia es final "); strB.append ("No soy inmutable"); ' –
Desde lombok v1.16.12 también hay soporte experimental para' var'. https://projectlombok.org/features/experimental/var.html –
@MatthiasBraun su ejemplo es incorrecto. En este caso, la clase StringBuilder es inmutable, solo agrega valor de cadena a su estructura interna mediante el método, esto es totalmente legal. –
he cocinado un plugin para IntelliJ que – – de una manera que da var
en Java.Es un truco, por lo que se aplican los descargos de responsabilidad habituales, pero si utiliza IntelliJ para su desarrollo de Java y desea probarlo, está en https://bitbucket.org/balpha/varsity.
Sería genial tener un atajo de teclado para doblar/desplegar tipos de declaración en el editor actual. Gran plugin sin embargo. – hotkey
@hotkey Esto utiliza el plegado de código incorporado de IntelliJ, para que pueda desplegar todo con Ctrl-Shift-NumPadPlus. Cuando el cursor está en una línea que contiene una declaración de variable plegada, puede Ctrl-NumPadPlus y Ctrl-NumPadMinus para plegar/desplegar las declaraciones en el método actual. Plegar todas las declaraciones es un poco incómodo, tienes que doblar todo (Ctrl-Shift-NumPadMinus) y luego desplegar todo de nuevo (Ctrl-Shift-NumPadPlus). – balpha
Una solución simple (suponiendo que esté utilizando un IDE decente) es simplemente escribir 'int' en todas partes y luego hacer que establezca el tipo para usted.
De hecho, acabo de agregar una clase llamada 'var' para que no tenga que escribir algo diferente.
El código sigue siendo demasiado detallado, pero al menos no tiene que escribirlo.
¿Cuándo dices "IDE decente" está excluido Eclipse *? - Esto no parece funcionar en Luna (al menos cuando lo intenté con 'int') - ¿Me falta algo? (*: aunque nunca llamaría a Eclipse IDE decente, no puedo juzgar por los demás ...) – BrainSlugs83
@ BrainSlugs83 dunno Estoy usando IDEA, eclipse no realmente usado anteriormente. ¿No corrige los tipos por ti? Estoy acostumbrado a C#/visual studio/resharper, que es como IDEA, ¡excepto que realmente funciona correctamente! En todos los jetbrains, puedes presionar alt-enter para obtener una lista de sugerencias cuando hay un error, por lo que establecer el tipo en int introduce un error en el que puedes ingresar y ordenar el tipo –
Sé que esto es más antiguo, pero ¿por qué no crear una clase var y crear constructores con diferentes tipos y dependiendo de qué constructores se invoque se obtiene var con diferente tipo. Incluso podría crear métodos para convertir un tipo en otro.
PEC - JDK Enhancement-Propuesta
http://openjdk.java.net/jeps/286
PEC 286: Local-Variable Tipo Inferencia
autor Brian Goetz
// Goals:
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
¿Qué versión de Java? 10? –
Lectura relacionada: [Primer contacto con 'var' en Java 10] (https://blog.codefx.org/java/java-10-var-type-inference/) –
Lombok
supports var pero sigue siendo clasificado como experimental:
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 variable
System.out.println(number);
Here es una trampa que debe evitarse al intentar usarlo en IntelliJ IDEA
. Parece que funciona como se esperaba, aunque incluye autocompletar y todo. Hasta que exista una solución "no hacky" (por ejemplo, debido a JEP 286: Local-Variable Type Inference), esta podría ser su mejor apuesta en este momento.
Tenga en cuenta que val
también es compatible con Lombok
sin modificar ni crear un lombok.config
.
Se admitirá en JDK 10. Incluso es posible verlo en acción en el early access build.
El JEP 286:
realzar el lenguaje Java para extender la inferencia de tipos de declaraciones de variables locales con inicializadores.
Así que ahora en lugar de escribir:
List<> list = new ArrayList<String>();
Stream<> stream = myStream();
Usted escribe:
var list = new ArrayList<String>();
var stream = myStream();
Notas:
var
es ahora una palabra clave reservada- Java es todavía compromiso con la tipa estática!
- Es solamente se pueden utilizar en las declaraciones de variables locales
- 1. ¿Cuál es el equivalente de VB.NET de la palabra clave "var" de C#?
- 2. En Objective-C, ¿cuál es el equivalente de la palabra clave "instanceof" de Java?
- 3. VB.NET equivalente a la palabra clave var C#
- 4. Equivalente de la palabra clave '#' de C# en Java
- 5. C# equivalente de la palabra clave Java 'implements'?
- 6. Cuál es el punto de "Como" palabra clave en C#
- 7. ¿Cuál es el equivalente en F # de la palabra clave predeterminada de C#?
- 8. ¿Hay un equivalente a la palabra clave "var" de C# en C++/CLI?
- 9. diferencia entre la palabra clave var y sin var
- 10. ¿Cuál es el equivalente de VB.NET de la palabra clave predeterminada de C#?
- 11. C++/CLI equivalente de la palabra clave 'readonly' de C#
- 12. ¿Cuál es el equivalente de VB.NET de la palabra clave C# readonly?
- 13. ¿Cuál es el equivalente de VB.NET de C# "es" palabra clave?
- 14. Está utilizando la palabra clave var bad en C# 2.0?
- 15. ¿Cuál es el propósito de esta palabra clave en C#
- 16. ¿Cuál es la palabra clave de rendimiento utilizada en C#?
- 17. ¿Equivalente a la palabra clave "using" de C# en powershell?
- 18. ¿Cuál es el equivalente de una palabra clave 'amigo' en C Sharp?
- 19. C++ equivalente de la palabra clave "dinámica" de C# 4.0?
- 20. ¿Cuál es la palabra clave 'propia' de Java
- 21. ¿Cuál es la ventaja de inicializar múltiples variables de JavaScript con la misma palabra clave var?
- 22. ¿Equivalente de la palabra clave C# `readonly` en D?
- 23. ¿Cuál es el uso de la palabra clave volátil?
- 24. ¿La nueva palabra clave 'dinámica' C# 4.0 desaprueba la palabra clave 'var'?
- 25. ¿Qué significa la palabra clave PHP 'var'?
- 26. ruby: ¿Cuál es el significado de la palabra clave "en"
- 27. ¿Cuál es la palabra clave explícita para en C++?
- 28. ¿Cuál es la diferencia entre dynamic (C# 4) y var?
- 29. ¿Cuál es el C# equivalente a la instancia de Java()?
- 30. Declaración de variables sin palabra clave var
'val' (o' var') si se utiliza un lenguaje particular "reemplazo de Java" ;-) –
@pst: que sería Scala? Hm sí, lo es. – rsenna
Para IntelliJ, presenté esto como una solicitud de función: http://youtrack.jetbrains.com/issue/IDEA-102808 El IDE podría colapsar el código para mostrar val o var aunque el código subyacente no lo tenga. –