泛型,通配符
泛型通配符:
- ?代表任意的数据类型
使用方式: - 不能创建对象时使用 ,如:ArrayList<?> list03=new ArrayList<?>();
- 只能作为方法参数使用,如:public static void printarray(ArrayList<?> list)
代码:
public class Generictongpei {
public static void main(String[] args) {
ArrayList<String> list01=new ArrayList<>();
list01.add("乔峰");
list01.add("段誉");
list01.add("虚竹");
ArrayList<Integer> list02=new ArrayList<>();
list02.add(26);
list02.add(18);
list02.add(22);
//ArrayList<?> list03=new ArrayList<?>();
printarray(list01);
printarray(list02);
}
public static void printarray(ArrayList<?> list)
{
Iterator<?> it = list.iterator();//迭代器也是用<?>代表数据类型
while (it.hasNext())
{
Object o = it.next();//由于不知道什么类型的,使用object类使用
System.out.println(o);
}
/*乔峰
段誉
虚竹
26
18
22*/
}
}
通配符的上界,下界
型的上限与下限
- 上限的限定:? extends E,代表使用的泛型只能是E类型的子类或者本生
- 下限的限定 : ? super E ,代表使用的泛型只能是E类型的父类或者本生
代码:
public class GenerictongpeiUpDown {
public static void main(String[] args) {
Collection<Integer> list01=new ArrayList<>();
Collection<String> list02=new ArrayList<>();
Collection<Number> list03=new ArrayList<>();
Collection<Object> list04=new ArrayList<>();
//integer extends number extends object.
getElement1(list01);
// getElement1(list02);没有任何继承关系
getElement1(list03);
//getElement1(list04);突破了界限,在number之外,number的父类
//getElement2(list01);是number的子类,在下限之下
//getElement2(list02);//没有任何继承=关系
getElement2(list03);
getElement2(list04);
}
public static void getElement1(Collection<? extends Number> coll) {
}
public static void getElement2(Collection<? super Number> coll) {
}