对于这个问题,我是这样理解的,因为泛型限定 ? super T:可以接收T类型或者T的父类型,那就是说可以接受Object类,而 Iterator<? super Worker> it=al.iterator();这个语句中的<? super Worker> 因为仅仅知道要操作Worker类或其父类,所以为了不出错,会自动将接收的元素变成Object类型,那么因为Object类中没有getName()方法,所以编译失败,要代码可以运行,就需要将类型强转一下
import java.util.*;
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
String getName()
{
return name;
}
}
class Worker extends Person
{
Worker(String name)
{
super(name);
}
}
class GenericDemo5
{
public static void main(String[] args)
{
ArrayList<Person> al=new ArrayList<Person>();
al.add(new Person("abc1"));
al.add(new Person("abc2"));
al.add(new Person("abc3"));
print(al);
ArrayList<Worker> al2=new ArrayList<Worker>();
al2.add(new Worker("abc...1"));
al2.add(new Worker("abc...2"));
al2.add(new Worker("abc...3"));
print(al2);
}
static void print(ArrayList<? super Worker>al)
{
Iterator<? super Worker> it=al.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
System.out.println(p.getName());
}
}
}