局部变量类型推断

原文:https://www.studytonight.com/java-10/local-variables-type-inference

Java 增加了一种使用var 关键字声明和初始化 Java 变量的新方法。它减少了在变量声明期间指定类型的工作量。通过使用 var,我们不需要使用intfloat等类型。它根据赋值自动推断变量的类型。这个特性在 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);
    }
}