在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;
其他回答
Java 10确实得到了局部变量类型推断,所以现在它有var,这与c#相当(据我所知)。
它还可以推断出不可标记的类型(程序员无法在该位置命名的类型;尽管哪些类型是不可标记的是不同的)。参见var和匿名类的技巧(你永远不应该在工作中使用)。
我能发现的一个区别是,在c#中,
如果一个名为var的类型在作用域中,那么var关键字将解析为该类型名称,并且不会被视为隐式类型局部变量声明的一部分。
在Java 10中,var不是一个合法的类型名称。
我知道这是旧的,但为什么不创建一个var类,创建不同类型的构造函数,根据调用的构造函数,你会得到不同类型的var。您甚至可以内置方法将一种类型转换为另一种类型。
一个简单的解决方案(假设你使用的是一个不错的IDE)是在所有地方输入'int',然后让它为你设置类型。
实际上我只是添加了一个名为var的类,所以我不需要输入不同的东西。
代码仍然过于冗长,但至少您不必键入它!
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中使用它时要避免的陷阱。它似乎工作如预期,但包括自动完成和一切。除非有一个“非黑客”的解决方案(例如,由于JEP 286:局部变量类型推断),这可能是您目前最好的选择。
注意,在不修改或创建Lombok .config的情况下,Lombok也支持val。
我已经为IntelliJ编写了一个插件,在某种程度上,它可以在Java中为您提供var。这是一个黑客,所以通常的免责声明也适用,但如果你在Java开发中使用IntelliJ并想尝试一下,请访问https://bitbucket.org/balpha/varsity。
推荐文章
- 如何在java中格式化持续时间?(如格式H:MM:SS)
- urlencoder .encode(字符串)已弃用,我应该使用什么代替?
- javax.transaction.Transactional vs . org.springframework.transaction.annotation.Transactional
- Java 8接口方法中不允许“同步”的原因是什么?
- 如何找到Java堆大小和内存使用(Linux)?
- 使用Enum实现单例(Java)
- RabbitMQ与通道和连接之间的关系
- buildSessionFactory()配置方法在Hibernate中已弃用?
- Spring MVC -如何获得所有的请求参数在一个地图在Spring控制器?
- 如何在Java中按两个字段排序?
- 文件之间的差异。路径中的分隔符和斜杠
- 在方法参数中使用NotNull注释
- Spring MVC中处理可选参数的@RequestParam
- Tomcat:如何查找正在运行的Tomcat版本?
- “java”、“javaw”和“javaws”之间有什么区别?