局部变量类型推断
原文:https://www.studytonight.com/java-10/local-variables-type-inference
Java 增加了一种使用var
关键字声明和初始化 Java 变量的新方法。它减少了在变量声明期间指定类型的工作量。通过使用 var,我们不需要使用int
、float
等类型。它根据赋值自动推断变量的类型。这个特性在 Java 中被称为局部变量类型推断或 LVTI 。让我们比较一下新版本和旧版本的方法。
// Java 9 or older
int a = 10;
// Java 10 or higher
var a = 10;
注意: 声明时需要初始化变量,否则编译器无法推断类型,会产生错误。
// Java 10 or higher
var a; // error: not allowed (must be initialized)
此功能仅限于–局部变量,包含初始值设定项、增强的 for 循环中的索引以及在传统 for 循环中声明的局部变量。它将不能用于方法形式、构造器形式、方法返回类型、字段、 catch 形式或任何其他类型的变量声明。
它可以在以下上下文中使用:
带有初始值设定项的局部变量
增强 for 循环中的索引
本地人用传统的 for 循环声明
示例:带初始值设定项的局部变量
这个例子解释了var
作为局部变量的用法。注意,我们创建了两个字符串变量,一个是通过使用String
类型,另一个是通过使用var
类型。两者在 Java 10 中都可以正常工作。
public class StudyTonight
{
public static void main(String args[])
{
String s = "StudyTonight";
var s2 = "StudyTonight";
System.out.println(s);
System.out.println(s2);
}
}
今晚学习 今晚学习
示例:变量必须初始化
这个例子解释了变量在用var
声明时必须初始化,否则编译器会产生错误。请看下面的例子。
public class CoreJava
{
public static void main(String args[])
{
String s = "StudyTonight";
var s2 ;
System.out.println(s);
System.out.println(s2);
}
}
错误:在没有初始值设定项的变量上不能使用“var”
使用 var 时,必须在同一位置初始化变量。不能将声明和初始化放在不同的地方。如果您没有在适当的位置初始化变量,那么您将会得到一个编译错误——没有初始化器就不能在变量上使用“var”。
var str;
str = "Studytonight" // not valid : error
集合中的局部变量推断示例
在这个例子中,我们使用var
创建了一个列表类型的变量,并看到它运行良好,并保存了列表元素。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args){
List<Integer> list = new ArrayList<>();
list = Arrays.asList(2,5,6,8,4,7);
// using var
var list2 = Arrays.asList(2,5,6,8,4,7);
System.out.println(list2);
}
}
【2,5,6,8,4,7】
示例:For 循环中的类型推断
Java 允许在 for 循环中使用 var 来创建局部变量。在这里,我们使用变量来声明一个变量来保存列表的元素。请看下面的例子。
import java.util.Arrays;
public class Main {
public static void main(String[] args){
var list = Arrays.asList(2,5,6,8,4,7);
for (var val : list) {
System.out.println(val);
}
}
}
2 5 6 8 4 7
它不能在以下上下文中使用:
在使用本地类型推断时,我们必须意识到它的范围有限,并且可以在有限的场景中使用。以下是 Java 不允许使用 var 的场景。
不允许作为类字段
不允许作为参数
不允许作为正式捕获
方法返回类型中不允许
方法参数中不允许
例:无法使用var
的地方
让我们举一个不使用var
的例子:
import java.util.Arrays;
public class Main {
static var price = 10; // Not allowed as instance variable
public static void main(String[] args){
var list = Arrays.asList(2,5,6,8,4,7);
for (var val : list) {
System.out.println(add(val, price)); // no return infered
}
}
// Not allowed in return type
static var add(int a, var b) // not allowed as parameter {
return (a+b);
}
}