问答详情
源自:4-4 学生选课---添加课程 Ⅰ

请问为什么从ArrayList集合中取出来的对象不能直接调用它的属性?

Course cr1 =new Course("1","1函数");
		coursesToSelect.add(cr1);
		//这样是可以的
		Course s= (Course)coursesToSelect.get(0);
		System.out.println(s.name);
		//这样是不行的,为什么?
		System.out.println(coursesToSelect.get(0).name);
		


提问者:风萧瑟 2015-12-26 10:59

个回答

  • 小幼苗之旅
    2015-12-26 11:33:40
    已采纳

    因为往集合里面添加或者取出类型的时候,无论之前是什么类型,都会变成Object类型,所以取出的时候也是Object类型,课程的名字是Course类型的,所以我们要把Object类型强转为Course类型,才能取得课程的名称

  • 七九九
    2016-02-27 22:50:52

    在文本编辑的时候是不能判断出类型转换是否能真正的转换成功,只能说明这个语法没有什么问题,是通过某些文件完成的静态分析。如果转换不成功,最终会报错。
    //这样是可以的
            Course s= (Course)coursesToSelect.get(0);
            System.out.println(s.name);
    因为类型转换已经从语法上通过了,s被认为是Course类对象,不管他实际上是不是,因为你声明s为Course类对象,如果强制转换错误,右边的才是原罪,s本身是没有错的。Course类对象可以调用name域。
    比如:          ListTest lt=new ListTest();
                    Object obj=new Object();
            lt=(ListTest)obj;
    语法上没有问题,但是运行时会报错。

    //这样是不行的,为什么?
            System.out.println((Course)coursesToSelect.get(0).name);
    我觉得有2种可能,我自己也不太明白:要么是因为静态分析是靠某些文件完成的,可能完成不了这种分析,毕竟这里的"."那么多,到底cast谁,要么是承认你的语法没有问题,但是不真正认为这个强制转换是成功的,不把(Courses)coursesToSelect.get(0)作为Course类对象,因此不允许调用name。前面成功是因为你是先声明了一个Course类对象变量s,注意,是声明了,所以可以调用name,至于成功与否,还要根据运行时,s是不是真的是一个Course类对象变量。