A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 回首、后_街 中级黑马   /  2013-5-7 21:02  /  1572 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 回首、后_街 于 2013-5-7 22:46 编辑

import java.util.ArrayList;
import java.util.Iterator;

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)

点评

还需是Student类的实例, 不能是Person p = new Person(“扯”);p就不能强转为Student了  发表于 2013-5-7 21:15

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 类型转换异常,强转(多态的引用对象还需是.

查看全部评分

9 个回复

倒序浏览
请问 是不是 Student 继承 了 Person。 ArrayList<? super Student>  这里表示的是 是 Student 的 父类吧。
System.out.println("....."+((Student)it.next()).show()); 这里强制转换,是向下转换。很有可能存在问题
回复 使用道具 举报
你这样没有指出是哪里出了问题了  而且代码不全的怎么看啊      但是看你这错误     我估计是你要把Person类型的对象强转成Student吧?而Person类是Student类的父类。如果是这样的话,肯定会出现这样的问题的。
回复 使用道具 举报
白磊 发表于 2013-5-7 21:30
你这样没有指出是哪里出了问题了  而且代码不全的怎么看啊      但是看你这错误     我估计是你要把Person ...

嗯 好的谢谢..
回复 使用道具 举报
ZhaoYuBetter 发表于 2013-5-7 21:16
请问 是不是 Student 继承 了 Person。 ArrayList

是的 Student类继承了 person类   
回复 使用道具 举报
本帖最后由 zms2100 于 2013-5-7 22:27 编辑

简单明了只说一点 :
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~)
回复 使用道具 举报
zms2100 发表于 2013-5-7 22:05
简单明了只说一点 :
public  static void arrnewPerson(ArrayList

这样写的话 无法调用Student类中show()方法
回复 使用道具 举报
回首、后_街 发表于 2013-5-7 22:27
这样写的话 无法调用Student类中show()方法

你父类Person类中有没有定义show() 方法啊? 如果有的话,可以直接把泛型定义为Person 类,那么肯定可以;
如果没有,那么多态的特性你应该也懂,O(∩_∩)O~............(父类本来没有,你怎么能让它实现子类才有的方法)
回复 使用道具 举报
zms2100 发表于 2013-5-7 22:30
你父类Person类中有没有定义show() 方法啊? 如果有的话,可以直接把泛型定义为Person 类,那么肯定可以 ...

一语惊醒梦中人啊 !谢谢了 .....
回复 使用道具 举报
回首、后_街 发表于 2013-5-7 22:32
一语惊醒梦中人啊 !谢谢了 .....

O(∩_∩)O~...........不客气,加油。(其实在我那段长篇大论里有讲,可能就是每次讲太多东西,不是自己的感悟,容易接收不了,我自己有时候也是这样,O(∩_∩)O~)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马