在c#中var关键字的一种用法是隐式类型声明。Java中var的等效语法是什么?


当前回答

没有。唉,你必须输入完整的类型名。

编辑:在发布7年后,Java 10中添加了局部变量的类型推断(使用var)。

编辑:在发布6年之后,收集下面的一些评论:

The reason C# has the var keyword is because it's possible to have Types that have no name in .NET. Eg: var myData = new { a = 1, b = "2" }; In this case, it would be impossible to give a proper type to myData. 6 years ago, this was impossible in Java (all Types had names, even if they were extremely verbose and unweildy). I do not know if this has changed in the mean time. var is not the same as dynamic. variables are still 100% statically typed. This will not compile: var myString = "foo"; myString = 3; var is also useful when the type is obvious from context. For example: var currentUser = User.GetCurrent(); I can say that in any code that I am responsible for, currentUser has a User or derived class in it. Obviously, if your implementation of User.GetCurrent return an int, then maybe this is a detriment to you. This has nothing to do with var, but if you have weird inheritance hierarchies where you shadow methods with other methods (eg new public void DoAThing()), don't forget that non-virtual methods are affected by the Type they are cast as. I can't imagine a real world scenario where this is indicative of good design, but this may not work as you expect: 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 As indicated, virtual methods are not affected by this. No, there is no non-clumsy way to initialize a var without an actual variable. 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 In this case, just do it the old fashioned way: object foo6;

其他回答

我知道这是旧的,但为什么不创建一个var类,创建不同类型的构造函数,根据调用的构造函数,你会得到不同类型的var。您甚至可以内置方法将一种类型转换为另一种类型。

我已经为IntelliJ编写了一个插件,在某种程度上,它可以在Java中为您提供var。这是一个黑客,所以通常的免责声明也适用,但如果你在Java开发中使用IntelliJ并想尝试一下,请访问https://bitbucket.org/balpha/varsity。

JDK 10将支持它。甚至可以在早期访问版本中看到它的作用。

JEP 286:

增强Java语言,将类型推断扩展到带有初始化式的局部变量声明。

所以现在不要写:

List<> list = new ArrayList<String>();
Stream<> stream = myStream();

你写的:

var list = new ArrayList<String>();
var stream = myStream();

注:

Var现在是一个保留类型名 Java仍然致力于静态类型! 它只能在局部变量声明中使用


如果你想尝试一下,而不是在本地系统上安装Java,我创建了一个安装了JDK 10的Docker镜像:

$ docker run -it marounbassam/ubuntu-java10 bash
root@299d86f1c39a:/# jdk-10/bin/jshell
Mar 30, 2018 9:07:07 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  Welcome to JShell -- Version 10
|  For an introduction type: /help intro

jshell> var list = new ArrayList<String>();
list ==> []

JEP - JDK增强提案

http://openjdk.java.net/jeps/286

JEP 286:局部变量类型推断

作者Brian Goetz

// Goals:
var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

你可以通过JetBrains查看Kotlin,但它是val。不是var。