Java 8 改进的类型推断
原文:https://www.studytonight.com/java-8/java-8-improved-type-inference
类型推断是编译器在泛型方法调用时推断Parameter
类型的一种能力。换句话说,我们可以说类型推断是基于上下文信息自动检测表达式的未指定数据类型的过程。
在 Java 8 中,类型推断得到了改进,并提供了在不指定类型的情况下调用泛型类型方法的能力。它用在集合 API 中,我们必须在创建新的数据结构时指定元素的类型。
现在,我们可以在不指定Parameter
类型的情况下调用相同的泛型类型和方法。编译器会在需要时自动推断Parameter
类型。
使用类型推断的目的是减少不必要的代码冗长。
举例时间:
让我们举个例子来理解类型推断。在这里,我们使用了两个声明,第一个使用了 Java 6 或早期版本,第二个使用了 Java 7 版本。我们可以注意到,在第二个声明中,我们使用了空菱形(<>)运算符,这些运算符显示了 Java 编译器的类型推断能力。
import java.util.ArrayList;
import java.util.List;
public class STDemo {
public static void main(String[] args) {
// Java earlier versions
List<Integer> numbers = new ArrayList<Integer>();
numbers.add(100);
numbers.add(101);
System.out.println(numbers);
// Java 7 version
numbers = new ArrayList<>();
numbers.add(102);
numbers.add(103);
System.out.println(numbers);
}
}
【100,101】 【102,103】
示例:Java 8 改进的类型推断
在 Java 8 中,类型推断得到了改进,这样我们就可以在不指定类型的情况下调用泛型方法。见下面的例子。
import java.util.ArrayList;
import java.util.List;
public class STDemo {
public static void main(String[] args) {
addMore(new ArrayList<>(), 12, 12);
}
static void addMore(List<Integer> list, int a, int b) {
list.add(a);
list.add(b);
System.out.println(list);
}
}
【12,12】
示例:
在本例中,我们向列表中添加了数组元素,但没有指定元素的类型,这显示了 Java 8 的类型推断能力。这里,我们使用了两个语句第一个使用 Java 7 语法来添加数组元素,而第二个使用 Java 8。请注意,我们必须提到 Java 7 中的元素类型,而 Java 8 中没有。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class STDemo {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(100);
numbers.add(101);
numbers.add(102);
numbers.add(103);
System.out.println(numbers);
// Java 7
numbers.addAll(Arrays.<Integer>asList(104));
System.out.println(numbers);
// Java 8
numbers.addAll(Arrays.asList(105));
System.out.println(numbers);
}
}
【100、101、102、103】 【100、101、102、103、104】 【100、101、102、103、104、105】
示例:Lambda 表达式中的类型推断
让我们再举一个例子,我们使用一个 lambda 表达式来打印列表元素。我们使用了 forEach()方法,在一个 lambda 表达式中,我们没有提到元素的类型,这是由于改进了类型推断。
import java.util.ArrayList;
import java.util.List;
public class STDemo {
public static void main(String[] args) {
// Java earlier versions
List<Integer> numbers = new ArrayList<>();
numbers.add(100);
numbers.add(101);
numbers.add(102);
numbers.add(103);
// Java 8 versions
numbers.forEach(element->System.out.println(element));
}
}
100 101 102 103