通配符(wildcard)
泛型类型是固定的,某些场景下使用起来不太灵活,于是,通配符就来了! 通配符可以允许参数类型变化。
//无界通配符: ?
//接收任何泛型类型数据,用于实现不依赖于具体类型参数的简单方法,可以捕获参数类型并交由泛型方法进行处理
public static void printList(List <?> list){/*........*/}
//上界通配符:?extends
//传入的类型实参必须是指定类型的子类型
public static void process(List <?extends Foo> list){/ * ... * /}
//下界通配符:?super
//传入的类型参数必须是指定类型的父类型
public static void addNumbers(List <?super Integer> list){}
泛型与通配符区别:最根本的区别就是,java编译器,把T(泛型)推断成具体类型,而把通配符?推断成未知类型。而java编辑器只能操作具体类型,不能操作未知类型。导致如果有对参数有修改的操作就必须要使用泛型,如果仅是查看就可以使用通配符. 利用以上推断,我们可以利用通配符特性设计出安全的接口,比如我在一个接口的方法定义了通配符参数,则继承该接口的所有方法,都不能修改该方法传递过来的参数。=>就像const 参数了。
浙公网安备 33010602011771号