public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Person> p = new ArrayList<Person>();
p.add(new Person("java01"));
p.add(new Person("java02"));
p.add(new Person("java03"));
p.add(new Person("java04"));
arrnewPerson(p);
ArrayList<Student> stu = new ArrayList<Student>();
stu.add(new Student("java01----11"));
stu.add(new Student("java。。。。2"));
arrnewPerson(stu);
}
public static void arrnewPerson(ArrayList<? super Student> al){
for(Iterator<? super Student> it = al.iterator(); it.hasNext();){
System.out.println("....."+((Student)it.next()).show());
}
}
}
运行该程序出现类型转换异常...帮忙问一下。。。
Exception in thread "main" java.lang.ClassCastException: Person cannot be cast to Student
at Test.arrnewPerson(Test.java:30)
at Test.main(Test.java:18)
简单明了只说一点 :
public static void arrnewPerson(ArrayList<? super Student> al){ //这里应该是ArrayList<? extends Person> al ; 下面有同样的,同这里。
for(Iterator<? super Student> it = al.iterator(); it.hasNext();){
System.out.println("....."+((Student)it.next()).show()); //另外泛型的作用就是为了避免强制,所以这里不能将父类强转成子类student对象。
}
}
之前这贴之前说的是我误以为是比较器的类,所以说如果你想要存储一个类的继承体系的中的所有类型成员,那么比较器必须是这个体系中最高的类(这里是Person)。(不过这句话对集合也通用)
这个多少有点不好理解(看视频开头的时候我也理解不了),说个不一定是规律的话: 这个? super T 和? extends T 很少能直接用到,暂时除了API 定义用于解释比较器和集合,也只有这里能用到? super T,至于下限符号 ? super T(至少我暂时没成功过,所以说少,? extends T 只有在这种传入方法调用迭代器成功的比较多)。
在API中它们的作用是告诉你 比如: 比较器Comparator(? super T) 是如果要比较Student类,你可以传入Student或Person(当然Person是Student的父类,而且只能是其一,没有那种上限格式的),而集合Collection(? extends T) 也就是你定义了一个Person类,那么这个集合容器中你可以添加Person类或者Person子类对象Student等。
截至之前的对泛型上下限的测试,它们应该来说只能是用于类(接口)、方法的泛型定义时(泛型的范围来的),能成功通用的情况也只有? extends T 的一些定义,不过看着自己上面的总结,可以找时间再(针对集合? extends T 、比较器 ? super T)测试一下,O(∩_∩)O~ (个人观点,水平暂时有限,仅供参考,O(∩_∩)O~)作者: 回首、后_街 时间: 2013-5-7 22:27
zms2100 发表于 2013-5-7 22:05
简单明了只说一点 :
public static void arrnewPerson(ArrayList