# Java教程 - 2 泛型

当在 Java 中使用泛型(Generics),我们可以将类型参数化,从而实现更通用和可重用的代码。泛型允许我们编写一次代码,适用于多种类型,提高了代码的灵活性和可维护性。

我们前面在使用集合的时候,已经接触过泛型了。

举个栗子:

List 使用泛型:

package com.doubibiji.generics;

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

public class GenericsTest {
    public static void main(String[] args) {
        // 使用泛型,只能放字符串类型
        List<String> colorList = new ArrayList<>();
        colorList.add("red");
        // colorList.add(123); // 报错,只能放字符串
				// 获取元素
        String s = colorList.get(0);
        System.out.println(s);

        // 使用泛型,只能放整形类型
        List<Integer> numList = new ArrayList<>();
        numList.add(123);
        // numList.add("red"); // 报错,只能放整形
				// 获取元素
        Integer i = numList.get(0);
        System.out.println(i);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

在上面,通过对 List 使用泛型,可以对集合中元素的类型进行约束,使用泛型可以创建不同元素类型的集合,在获取元素的时候也不用进行类型转换。

List<String> colorList = new ArrayList<String>();
// JDK1.7以后可以简化
List<String> colorList = new ArrayList<>();
1
2
3

如果不使用泛型,那么集合中的元素的类型就是 Object 类型,虽然可以添加任何类型的元素,但是在获取元素的时候,就无法知道原来是什么类型的,就需要进行强制转换,如果类型不匹配,还会报错。

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

public class GenericsTest {
    public static void main(String[] args) {
        // 不使用泛型,没有类型限制
        List list = new ArrayList();
        list.add(123);
        list.add("doubi");

        if (list.get(0) instanceof Integer) {
            Integer i = (Integer) list.get(0);
            System.out.println(i);
        }

        if (list.get(1) instanceof String) {
            String s = (String) list.get(1);
            System.out.println(s);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

所以使用泛型可以减少类型转换,提高代码复用,使代码更安全清晰。

同样,Map也可以指定泛型:

public static void main(String[] args) {
    Map<String, Integer> map = new HashMap<>();
    map.put("zhangsan", 123);
    map.put("lisi", 234);

    Integer value1 = map.get("zhangsan");
    System.out.println(value1);
}
1
2
3
4
5
6
7
8

我们也可以使用泛型机制创建我们的泛型类、泛型方法和泛型接口。

内容未完......