当前位置: 首页 > 教程 > Java8 >

Java8 类型推断

精华
小牛编辑
126浏览
2023-03-14

1 Java8 类型推断的介绍

类型推断是Java的一项功能,它使编译器可以查看每个方法调用和相应的声明以确定参数的类型。

Java在Java 8中提供了类型推断的改进版本。

1.1 Java8以前

List<Integer> list = new ArrayList<Integer>();  

在下面的声明中,我们在一侧提到了arraylist的类型。这种方法是在Java 7中引入的。在这里,您可以将第二面留为<>,并且编译器将通过引用变量的类型来推断其类型。

List<Integer> list2 = new ArrayList<>();   

1.2 Java8以后

在Java 8中,您可以调用专用方法而无需明确提及参数的类型。

showList(new ArrayList<>());  

2 Java8 类型推断的案例1

您可以对通用类和方法使用类型推断。

/**
 * 小牛知识库网: https://www.xnip.cn
 */
import java.util.ArrayList;  
import java.util.List;  
public class TypeInferenceExample {  
    public static void showList(List<Integer>list){  
        if(!list.isEmpty()){  
            list.forEach(System.out::println);  
        }else System.out.println("list is empty");  
    }  
    public static void main(String[] args) {  
        // An old approach(prior to Java 7) to create a list  
        List<Integer> list1 = new ArrayList<Integer>();  
        list1.add(11);  
        showList(list1);  
        // Java 7    
        List<Integer> list2 = new ArrayList<>(); // You can left it blank, compiler can infer type  
        list2.add(12);  
        showList(list2);  
        // Compiler infers type of ArrayList, in Java 8  
        showList(new ArrayList<>());  
    }  
} 

输出结果为:

11
12
list is empty

您还可以创建自己的自定义通用类和方法。在下面的示例中,我们将创建自己的泛型类和方法。

3 Java8 类型推断的案例2

/**
 * 小牛知识库网: https://www.xnip.cn
 */
class GenericClass<X> {  
      X name;  
    public void setName(X name){  
        this.name = name;  
      }  
    public X getName(){  
        returnname;  
      }  
    public String genericMethod(GenericClass<String> x){  
        x.setName("John");  
        returnx.name;  
      }  
}  
  
public class TypeInferenceExample {  
    public static void main(String[] args) {  
        GenericClass<String> genericClass = new GenericClass<String>();  
        genericClass.setName("Peter");  
        System.out.println(genericClass.getName());  
          
        GenericClass<String> genericClass2 = new GenericClass<>();  
        genericClass2.setName("peter");  
        System.out.println(genericClass2.getName());  
      
        // New improved type inference  
        System.out.println(genericClass2.genericMethod(new GenericClass<>()));  
    }  
}

输出结果为:

Peter
peter
John