通配符有三种:
第一种: 问号(?),表示所有类型
第二种:extends + 类名 ,表示该类及继承了该类的类型
第三种:super + 类名, 表示该类和该类的父类
第一种:?
因为List是有泛型的,用一个<?>表示我在调用test1()方法时可以传入一个实行了List接口的类的对象,并给list的泛型指定一个类型,这个类型就可以是任意类型
效果和这样写是一样的,也是在调用test1() 方法时要给E指定一个类型,但是这样写要定义一个泛型,比较麻烦,而且如果我E只是在形参用一下,还来为它专门定义一个泛型就有些繁琐了
第二种:extends
有三个类,Aa,Bb,Cc,继承关系如图
给类Dd定义一个泛型<E extends Aa>, 这表示:在给E指定泛型的时候,就只能指定Aa及其子类(在这里就有Bb,Cc)
同理:方法中也是一样的用法
方法形参中:表示传入一个实现了List接口的类的对象,并且在指定该对象的泛型时,只能是Aa及其子类
第三种:super
super貌似只能应用于以下两种情况
这种情况就是在传参时只能是Aa及其父类
ArrayList <>里面只能是Aa及其父类