在c#中var关键字的一种用法是隐式类型声明。Java中var的等效语法是什么?
当前回答
如果您将Lombok添加到项目中,您可以使用它的val关键字。
http://projectlombok.org/features/val.html
其他回答
没有。唉,你必须输入完整的类型名。
编辑:在发布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;
一个简单的解决方案(假设你使用的是一个不错的IDE)是在所有地方输入'int',然后让它为你设置类型。
实际上我只是添加了一个名为var的类,所以我不需要输入不同的东西。
代码仍然过于冗长,但至少您不必键入它!
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>
随着3月20日JDK 10的发布,Java现在包含了一个在JEP 286中指定的var保留类型名称(不是关键字,请参阅下文)。对于局部变量,以下语句现在在Java 10或更高版本中有效:
var map = new HashMap<String, Integer>();
Java中的var保留类型名与c#中的var关键字几乎相同,因为两者都允许隐式类型(参见下面的重要区别)。var在Java中只能用于以下上下文中的隐式类型推断(如JEP 286: Goals中所列举的):
带有初始化式的局部变量 增强的for循环中的索引 在传统的for循环中声明了Locals
因此,var不能用于字段、返回类型、类名或接口名。它的基本原理是在声明和定义局部变量时不需要包含长类型名,如JEP 286(由Brian Goetz撰写)所述:
我们试图通过减少仪式来改善开发人员的体验 与编写Java代码相关,同时保持Java的承诺 静态类型安全,通过允许开发人员省略 通常不必要的局部变量类型的清单声明。
var Java中的作用域
需要注意的是,var在Java中不是关键字,而是保留的类型名。引用自JEP 286:
标识符var不是关键字;相反,它是一个保留类型 的名字。这意味着使用var作为变量、方法或 软件包名称不受影响;使用var作为类或 接口名称将受到影响(但这些名称在实践中很少见, 因为它们违反了通常的命名约定)。
注意,由于var是保留类型名而不是关键字,因此它仍然可以用于包名、方法名和变量名(以及它的新类型干扰角色)。例如,以下是在Java中有效使用var的所有示例:
var i = 0;
var var = 1;
for (var i = 0; i < 10; i++) { /* ... */ }
public int var() { return 0; }
package var;
引用自JEP 286:
此处理将限制于局部变量 中声明的初始化式、增强的for循环中的索引和局部变量 传统的for循环;它不能用于方法形式, 构造函数形式、方法返回类型、字段、捕获形式或 任何其他类型的变量声明。
Java和C中var的区别
这是c#和Java中var的一个显著区别,包括:var在c#中可以用作类型名,但在Java中不能用作类名或接口名。根据c#文档(隐式类型局部变量):
如果一个名为var的类型在作用域中,那么var关键字将解析为 该类型名不会被视为隐式类型的一部分 局部变量声明。
在c#中使用var作为类型名的能力带来了一些复杂性,并引入了一些复杂的解析规则,而在Java中,var通过禁止var作为类或接口名来避免这些问题。有关c#中var类型名称的复杂性的信息,请参见应用于隐式类型变量声明的限制。有关Java中' var的作用域决定背后的原理的更多信息,请参见JEP 286:作用域选择。
我知道这是旧的,但为什么不创建一个var类,创建不同类型的构造函数,根据调用的构造函数,你会得到不同类型的var。您甚至可以内置方法将一种类型转换为另一种类型。
推荐文章
- 到底是什么导致了堆栈溢出错误?
- 为什么Android工作室说“等待调试器”如果我不调试?
- Java:路径vs文件
- ExecutorService,如何等待所有任务完成
- Maven依赖Servlet 3.0 API?
- 如何在IntelliJ IDEA中添加目录到应用程序运行概要文件中的类路径?
- getter和setter是糟糕的设计吗?相互矛盾的建议
- Android room persistent: AppDatabase_Impl不存在
- Java的String[]在Kotlin中等价于什么?
- Intellij IDEA上的System.out.println()快捷方式
- 使用Spring RestTemplate获取JSON对象列表
- Spring JPA选择特定的列
- URLEncoder不能翻译空格字符
- Java中的super()
- 如何转换JSON字符串映射<字符串,字符串>与杰克逊JSON