Java 泛型:泛型函数


#Java 反射、泛型与注解#


简介

什么是泛型类?

泛型变量,在函数定义时声明。

示例:基础示例

package com.example;

import java.util.ArrayList;
import java.util.List;

public class TestGeneric {

    // 泛型函数
    private static <T> T getFirst(List<T> dataList) {
        if (dataList == null || dataList.size() == 0) {
            return null;
        }
        return dataList.get(0);
    }

    // main 入口
    public static void main(String[] args) {
        List<Long> numList = new ArrayList<>();
        numList.add(123L);
        numList.add(456L);
        Long first = getFirst(numList);

        System.out.println(first);
    }

}

执行结果:

123

示例:限制泛型变量的实际类型

比如限制必须是 Number 类或者其子类:

package com.example;

import java.util.ArrayList;
import java.util.List;

public class TestGeneric {

    // 泛型函数
    private static <T extends Number> T getFirst(List<T> dataList) {
        if (dataList == null || dataList.size() == 0) {
            return null;
        }
        return dataList.get(0);
    }

    // main 入口
    public static void main(String[] args) {
        List<Long> numList = new ArrayList<>();
        numList.add(123L);
        numList.add(456L);
        Long first = getFirst(numList);
        System.out.println(first);  // 输出 123

        // 下面这个会编译报错
        getFirst(new ArrayList<String>());
    }

}

示例:将泛型类型对应的实际 Class 作为参数传入泛型函数

代码:

package com.example;

import java.util.ArrayList;
import java.util.List;

public class TestGeneric {

    // 泛型函数
    private static <T> T getFirst(List<T> dataList, Class<T> cls) {
        if (dataList == null || dataList.size() == 0) {
            return null;
        }
        System.out.println("泛型类型的实际类型是: " + cls.getCanonicalName());
        return dataList.get(0);
    }

    // main 入口
    public static void main(String[] args) {
        List<Long> numList = new ArrayList<>();
        numList.add(123L);
        numList.add(456L);
        Long first = getFirst(numList, Long.class);
        System.out.println(first);
    }

}

执行结果:

泛型类型的实际类型是: java.lang.Long
123

注意,因为 numList 类型是 List<Long> ,所以 getFirst 的第2个参数必须是 Long.class 。若是 Integer.class 等其他值,会报错。


( 本文完 )