风萧瑟
2015-12-26 10:59
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);
因为往集合里面添加或者取出类型的时候,无论之前是什么类型,都会变成Object类型,所以取出的时候也是Object类型,课程的名字是Course类型的,所以我们要把Object类型强转为Course类型,才能取得课程的名称
在文本编辑的时候是不能判断出类型转换是否能真正的转换成功,只能说明这个语法没有什么问题,是通过某些文件完成的静态分析。如果转换不成功,最终会报错。
//这样是可以的
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类对象变量。
Java入门第三季
409792 学习 · 4340 问题
相似问题