在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关键字。
我已经为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
。