为了账号安全,请及时绑定邮箱和手机立即绑定

请问为什么从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);
		


正在回答

2 回答

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

1 回复 有任何疑惑可以回复我~
#1

风萧瑟 提问者

System.out.println((Course)coursesToSelect.get(0).name); 那这样算不算强转为了Course类型?
2015-12-26 回复 有任何疑惑可以回复我~
#2

风萧瑟 提问者

非常感谢!
2016-01-07 回复 有任何疑惑可以回复我~

在文本编辑的时候是不能判断出类型转换是否能真正的转换成功,只能说明这个语法没有什么问题,是通过某些文件完成的静态分析。如果转换不成功,最终会报错。
//这样是可以的
        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类对象变量。


0 回复 有任何疑惑可以回复我~
#1

七九九

//这样是不行的,为什么? System.out.println((Course)coursesToSelect.get(0).name); 真正原因:运算优先的问题,先将coursesToSelect.get(0)作为Object类对象,尝试调用name不成功,强制转换的优先级靠后了。理由如下: System.out.println(((Course)coursesToSelect.get(0)).name); 这个写法就可以了,加个括号改变优先级。
2016-02-27 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信