Java 泛型是一种在代码编写时提供更强类型检查和更好的代码重用功能的特性。它被设计用来允许编程人员编写能够在不失灵活性的同时能够避免类型错误的代码。泛型允许类、接口、方法在定义时使用一个或多个类型形参(type parameter),以后使用时再传入具体的类型实参(type argument)。这种参数化类型的方式可以有效的将类型的检查和转换由运行时转移至编译时。
public class Box<T> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } public static void main(String[] args) { Box<String> box = new Box<>(); box.set("hello"); System.out.println(box.get()); } }
泛型中的问号(?)被称为通配符(Wildcard),它用来指代任意类型。问号通配符可以用在参数中,也可以用在返回值类型中。在泛型的类型中,通配符 ? 用作类型参数,表示可以接受任何类型参数的参数化类型。通配符的主要作用就是灵活而简洁地表达各种要求。
public static double sum(ArrayList<? extends Number> list) { double sum = 0; for (Number n : list) { sum += n.doubleValue(); } return sum; } public static void main(String[] args) { ArrayList<Integer> intList = new ArrayList<>(); intList.add(1); intList.add(2); intList.add(3); System.out.println(sum(intList)); }
当使用通配符 ? 时有几种限制:
- 不能用在声明中,例如不能声明 extends Number n>
- 不能用于方法调用中返回类型的限制,例如 List<? extends Number> list = new ArrayList<>();
- 不能添加或修改泛型集合中通配符 ? 声明的元素。