Java 类型通配符的一点思考
List<?> list=new ArrayList<Interger>();
以这样的类型为例,这是List泛型中的一种,采用类型通配符限定与list匹配的类型,只用?时,list可以与任意类型的数组匹配;
使用?extends A 时候,表明list只能与A以及A 的子类匹配;
使用?super A时候,表明list只能与A以及A的父类匹配;
举例:
List<?> list=new ArrayList<Interger>(); 成功;
List<?> list=new ArrayList<String>(); 成功;
List<?extends Number> list2=new ArrayList<Integer>(); 成功;
List<?extends Number> list2=new ArrayList<Object>(); 失败;因为Object是所有类的父类,不满足是Number类子类的特点
定义完之后有什么用呢?
1、list对象是无法实现添加元素的,只能用赋值的方式存储,且必须是同类型的
例如:
List<?> list=new ArrayList<Interger>();
list已经同存储Integer类型的ArrayList类匹配了,只能用相对应的类型赋值;
List<String> list1=new ArrayList<String>();
list1.add("Hello");
list1.add("World");
list=list1; 失败!!!类型不匹配,list1是存储了S挺类型的ArrayList类的对象,两者不匹配;
2、list对象赋值完毕后可以遍历,目前for增强的迭代器并不能用,可以使用普通的for循环以及迭代器
package LeixingTongPei;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<?> list1=new ArrayList<String>();
List<String> list=new ArrayList<String>();
//List<? extends Number> list2=new ArrayList<String>(); //String和Number是同级别的;
List<?extends Number> list2=new ArrayList<Integer>();
list.add("Hello");
list.add("world");
list.add("Java");
list1=list;
/*for(String a:list)
{
System.out.println(a);
}
for(int i=0;i<list1.size();i++)
{
System.out.println(list1.get(i));
}*/
Iterator<?> it= list1.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
System.out.println(list);
System.out.println(list1);
}
}