在Java中的C#var关键字相当于?

在C#中使用var关键字是隐式types声明。 什么是Java的等效语法的var

空无一人。 唉,你必须input完整的types名称。

编辑6年后发布,收集一些评论如下:

  • C#有var关键字的原因是因为可能有.NET中没有名字的types。 例如:

     var myData = new { a = 1, b = "2" }; 

    在这种情况下,将不可能给myData一个正确的types。 6年前,这在Java中是不可能的(所有types都有名字,即使它们非常详细也不stream畅)。 我不知道这是否同时改变了。

  • var不一样dynamic 。 variables仍然是100%静态types。 这不会编译:

     var myString = "foo"; myString = 3; 
  • 当types从上下文显而易见时, var也是有用的。 例如:

     var currentUser = User.GetCurrent(); 

    我可以说,在我负责的任何代码中, currentUser都有一个User或派生类。 显然,如果你的User.GetCurrent的实现返回一个int,那么也许这对你是有害的。

  • 这与var无关,但是如果你有其他方法(例如new public void DoAThing() )影射方法的怪异inheritance层次结构,请不要忘记非虚方法会受到作为types转换的Type的影响。

    我无法想象一个真实的世界情景,这是指示良好的devise,但这可能不会如你所期望的那样工作:

     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 

    如上所述,虚拟方法不受此影响。

  • 不,没有非笨拙的方式来初始化一个没有实际variables的variables。

     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 

    在这种情况下,只要做到这一点老式的方式:

     object foo6; 

如果您将Lombok添加到您的项目中,您可以使用val关键字。

http://projectlombok.org/features/val.html

我已经为IntelliJ制作了一个插件 – 以某种方式 – 为您提供Java中的var 。 这是一个黑客攻击,所以通常的免责声明都适用,但是如果你为你的Java开发使用IntelliJ,并且想尝试一下,你可以访问https://bitbucket.org/balpha/varsity

一个简单的解决scheme(假设你正在使用一个体面的ide)。 只需在每个地方input“int”,然后让它为你设置types。

实际上我只是添加了一个名为“var”的类,所以我不必input不同的东西。

代码仍然太冗长,但至less你不必input它!

JEP – JDK增强build议

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

JEP 286:局部variablestypes推断

作者Brian Goetz

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

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

我知道这是旧的,但为什么不创build一个var类和创build不同types的构造函数,并根据哪些构造函数被调用,你得到不同types的变种。 你甚至可以build立方法来将一种types转换为另一种types。

Lombok支持var,但它仍然被归类为实验:

 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); 

IntelliJ IDEA尝试使用它时,要避免这个问题。 它似乎按预期工作,但包括自动完成和一切。 直到有一个“非hacky”解决scheme(例如,由于JEP 286:本地variablestypes推断 ),这可能是你现在最好的select。

请注意, val也支持Lombok ,而无需修改或创buildlombok.config