MST

星途 面试题库

面试题:Java泛型通配符复杂应用

假设有一个方法printList,该方法需要接受一个包含数字(Number及其子类)的列表,并打印出列表中的元素。请使用Java泛型的通配符来实现这个方法,并说明为什么要这样使用通配符,同时解释`? extends Number`和`? super Number`的区别及适用场景。
26.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

实现printList方法

import java.util.List;

public class GenericExample {
    public static void printList(List<? extends Number> list) {
        for (Number num : list) {
            System.out.println(num);
        }
    }
}

为什么使用通配符

使用? extends Number通配符,意味着这个列表可以包含Number及其任何子类的元素。这样可以保证在方法内部安全地读取列表中的元素,因为我们知道这些元素都是Number类型或其子类,从而可以执行Number类定义的操作(如print)。

? extends Number? super Number 的区别及适用场景

  1. ? extends Number
    • 含义:表示类型是Number的子类(包括Number自身)。
    • 适用场景:适用于方法主要是从列表中读取数据的场景。例如上述printList方法,它只需要读取列表中的元素并打印,不关心具体是Number的哪个子类,只要是Number及其子类即可。在这种情况下使用? extends Number,可以接受任何包含Number子类元素的列表,增加了方法的通用性。
  2. ? super Number
    • 含义:表示类型是Number的超类(包括Number自身)。
    • 适用场景:适用于方法主要是向列表中写入数据的场景。例如,如果有一个方法需要将Number及其子类的对象添加到列表中,使用? super Number可以确保列表的类型能够接受这些对象。例如:
import java.util.ArrayList;
import java.util.List;

public class GenericExample {
    public static void addNumber(List<? super Number> list, Number num) {
        list.add(num);
    }

    public static void main(String[] args) {
        List<Object> objectList = new ArrayList<>();
        addNumber(objectList, 10); // 10是Integer,是Number的子类
    }
}

在上述addNumber方法中,使用? super Number确保了无论列表实际的类型是什么(只要是Number的超类),都可以安全地将Number及其子类的对象添加到列表中。如果使用? extends Number,由于编译器只知道列表元素是Number的子类,但具体是哪个子类不确定,所以不允许向列表中写入(除了null),因为可能会违反类型安全。