Java泛型T、K、E、V、?

T、E、K、V、? 的含义

T,E,K,V 是类型参数(Type Parameter),而?是通配符(Wildcard)。他们虽然都用在泛型中,但扮演的角色完全不同。Java 官方并没有强制规定这些字母的含义,只是社区形成了约定俗成的写法。常见规则如下:

为什么用泛型

-  类型不安全:可以存入任何类型(String、Integer 等),但取出时容易忘记转换或转换错误 -  繁琐的强制转换:每次取出都要手动 cast -  运行时错误:如果类型转换错了,会抛出 ClassCastException

T

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public class Box<T> {
    private T item;  // T是类型参数
    
    public void setItem(T item) {
        this.item = item;
    }
    
    public T getItem() {
        return item;  // 不需要强制转换
    }
}

Box<String> stringBox = new Box<>();
        stringBox.setItem("Hello");
        // 自动就是String类型,无需转换
        String s = stringBox.getItem();  

无界通配符 ?

1
2
3
4
5
public static void printList(List<?> list) {
        for (Object element : list) {
            System.out.println(element);
        }
    }

上界通配符 ? extends T

表示“某种类型是 T 或 T 的子类”,适合生产者/只读场景

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public static void printNumbers(List<? extends Number> list) {
        for (Number n : list) {
            System.out.println(n);
        }
    }

public static void main(String[] args) {
        List<Integer> ints = Arrays.asList(1, 2, 3);
        List<Double> doubles = Arrays.asList(1.1, 2.2, 3.3);

        // 可以读取元素为 Number 类型,不能add元素
        printNumbers(ints);    // Integer extends Number
        printNumbers(doubles); // Double extends Number
    }

下界通配符 ? super T

表示“某种类型是 T 或 T 的父类”,适合消费者/写入场景

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 public static void addNumbers(List<? super Integer> list) {
        list.add(10);
        list.add(20);
    }

    public static void main(String[] args) {
        List<Number> numbers = new ArrayList<>();
        List<Object> objects = new ArrayList<>();

        //可以安全向集合写入 Integer 类型
        addNumbers(numbers); // Number 是 Integer 的父类
        addNumbers(objects); // Object 是 Integer 的父类

        System.out.println(numbers); // 输出 [10, 20]
        System.out.println(objects); // 输出 [10, 20]
    }

总结

读(生产者)用 extends,写(消费者)用 super。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计