问答详情
源自:4-9 学生选课---应用泛型管理课程 Ⅰ

不明白为什么添加的一定要是course类型

2分30秒向courseToSelect中添加字符串时报错(Exception in thread"main"java.lang.ClassCastException:xxxxx,为什么一定要求add的必须是course类型哇?

提问者:怒城 2016-01-13 13:26

个回答

  • 慕移动9181930
    2022-03-27 18:56:07

    换了还是报错啊~

  • 软件研究所
    2016-02-17 09:10:47

    我也刚学,也有这个问题,我试了试,觉的“3000sama"同学说得不对,”菜鸟起飞点“说的对但没解释清楚:1、”为什么一定要求add的必须是course类型哇?“  答:不是一定!里面可以随便添加其他类型,你可以尝试添加

    public void testAdd() {

    Course cr1 = new Course("1", "数据结构");

    coursesToSelect.add(cr1);

    Course temp = (Course) coursesToSelect.get(0);

    System.out.println("添加了课程" + temp.id + temp.name);

    coursesToSelect.add("我是字符串");

    System.out.println(coursesToSelect.get(1));

    }

    不使用foreach循环遍历,而是使用普通打印,你会发现字符串已经被添加而且被打印出来了。老师的课程之所以报错,是因为老师使用的是

    foreach(Object obj:soursesToSelect){

    Course cr = (Couse)obj;//     报错是出在了这里,是因为存入的String类型”我是字符串“不能被强制转换。并不是不能存,而是已经存进去不能强转罢了。

    }

    结论是:add里可以添加其他类型。

  • 怒城
    2016-02-10 16:01:56

    谢谢大神们啊↖(^ω^)↗

  • 一条小咸鱼
    2016-02-10 12:25:45

    private List<Course> courses;
    //因为定义了泛型Course,表示List里面只能放Course类型的对象(的引用)


  • 菜鸟起飞点
    2016-01-21 07:36:11

    报错的地方为testForEach方法,当我们在遍历时,代码表达的是将集合中的Object类型的元素强转成课程类型的元素(因为我们一直往集合中添加的就是课程类型的元素),所以当你往集合中添加String类的元素,在遍历时会报错。

  • 3000sama
    2016-01-13 13:53:40

    因为Course本身是个List类型的集合,之前我们操作各种方法的前提是我们定义了一个course类,这个类有序号,也有值,我们在使用这个集合的时候规定了只能采用这种方式来添加(取出、修改等)集合的元素,因此在当前的Course中,它只会识别course类,其他类(例如视频中的String)会报错。

    如果你在一开始course类中把它定义成String类型,你就可以add String了,但是我们现在操作的是一个集合,光光String不符合要求,还需要对应的序号。


    一点看法,欢迎讨论。