AFAIK,var
不是 Java 中的关键字。它是保留类型名称。我想知道在什么情况下我们应该使用/避免它。是否有关于其使用的原则?
import java.util.HashMap;
public class Test {
public static void main(String[] args) {
var x = new HashMap<> (); // legal
var y = new HashMap<String, Integer>(); // legal
var z = "soner"; // legal
System.out.println(z);
var umm = null; // xx wrong xx //
var foo; // xx wrong usage without initializer xx //
var var = 5; // legal
}
}
答案 0 :(得分:12)
我知道一个原因,我们实际上在我们的项目中使用。每当有一个变量是&#34;大&#34;我们用var替换它。例如:
public void test(){
CreateEmailEsignTransactionAsync job = new CreateEmailEsignTransactionAsync(... some input);
// vs
var job = new CreateEmailEsignTransactionAsync(... some input)
}
我发现第二个例子更具可读性,这就是我们主要使用它的方式。
还有另一个例子可以使用它(但到目前为止我还没有使用它)。以前,这可以通过链接仅用于lambda表达式,例如,因为这只是编译器已知的类型 - 它们无法声明。
public void test() {
var test = new Object() {
public void go() {
}
};
test.go();
}
答案 1 :(得分:7)
我可以看到使用var
aka&#34; 本地类型推断&#34;的一个缺点:
var x = "A";
// String x
var y = getInstance(x);
//? y
在这种情况下,您需要检查getInstance(String)
方法的签名,以了解y
类型的内容。
编辑:
由于讨论了我的变量名称不是很正确,所以让我们使用一些真实的例子。
var sDate = "20180426";
var date = DateUtil.getDate(sDate);
date
是什么类型的?
我可以打电话
public static java.util.Date getDate(String);
public static java.sql.Date getDate(String);
public static java.time.LocalDate getDate(String);
我不相信解决方案是使用全名。
var javaUtilDate
var javaSqllDate
var javaTimeLocalDate
相反,在这种情况下,我不会使用类型推断
var sDate = "20180426";
LocalDate date = DateUtil.getDate(sDate);
注意:如果我使用LocalDate
,有人可以告诉我这是否需要导入var
(注意我在不同的类中使用方法,所以我从来没有必须声明{ {1}}本课程。)
如果我找到安装JDK10的时间,我会自己回答。
答案 2 :(得分:3)
您也可以将它用于匿名类,即没有要声明的类型。 E.g。
{{1}}