?通配符
当接收的类型不确定时,可以使用?通配符,?可以指向任何类型
public class Demo {
public static void main(String[] args) {
xx(new ArrayList<String>());
xx(new ArrayList<Integer>());
}
public static void xx(Collection<?> c){
/*当使用?通配符时,不能再调用与类型相关的方法
* 因为?指向的是一种不确定的类型
*/
//c.add("sss");
c.size();//这个方法与类型无关
for(Object ob: c){
System.out.println(ob);
}
}
}
泛型的上边界和下边界
1.限制上边界
正确使用方法:Vector<? extends Number> x=new Vector<Integer>();
错误使用方法:Vector<? extends Number> x=new Vector<String>();
泛型类中的使用方法:
//继承它的子类中的泛型必须实现Serializable和Cloneable接口
public class BaseDao<T extends Serializable,Cloneable> {
}
//例如
public class BookDao extends BaseDao<Book> {
}
//这里的Book需要实现这两个接口
public class Book implements Serializable,Cloneable{
}
限制下边界
正确使用方法:Vector<? extends Integer> x=new Vector<Number>();
错误使用方法:Vector<? extends Integer> x=new Vector<Byte>();
注意:以下代码编译不能通过
public void add(List<? extends Number> list){
//当使用?通配符时,不能再调用与类型相关的方法,指定了边界也不行
list.add(100);
}