简单来说,?和T都表示不确定的类型,List<T> 和Map<K,V>
等使用到了泛型,也就是它不指明具体是哪一种类型,而是在使用时在传入。并且可以在代码中使用到T.
代码如下:
public static void printColl(ArrayList<?> al){
Iterator<?> it = al.iterator();
while(it.hasNext())
{
T t = it.next();
System.out.println(t);
System.out.println(it.next().toString());
}
而?是类型通配符,可以指普通的Object或者其子类。使用示例:
public static void printCollecton(Collection <?> collection)
{
for(Object obj: collection)
{
System.out.println(obj);
}
}
泛型三种:
[1]ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T类型
[2]ArrayList<?> al=new ArrayList<?>();集合元素可以是任意类型,这种没有意义,一般是方法中,只是为了说明用法
[3]ArrayList<? extends E> al=new ArrayList<? extends E>();
泛型的限定:
? extends E:接收E类型或者E的子类型。
?super E:接收E类型或者E的父类型。
参考文章:java泛型中<?>和<T>有什么区别?