請問為什么從ArrayList集合中取出來的對象不能直接調(diào)用它的屬性?
Course?cr1?=new?Course("1","1函數(shù)"); coursesToSelect.add(cr1); //這樣是可以的 Course?s=?(Course)coursesToSelect.get(0); System.out.println(s.name); //這樣是不行的,為什么? System.out.println(coursesToSelect.get(0).name);
2015-12-26
因為往集合里面添加或者取出類型的時候,無論之前是什么類型,都會變成Object類型,所以取出的時候也是Object類型,課程的名字是Course類型的,所以我們要把Object類型強轉(zhuǎn)為Course類型,才能取得課程的名稱
2016-02-27
在文本編輯的時候是不能判斷出類型轉(zhuǎn)換是否能真正的轉(zhuǎn)換成功,只能說明這個語法沒有什么問題,是通過某些文件完成的靜態(tài)分析。如果轉(zhuǎn)換不成功,最終會報錯。
//這樣是可以的
??????? Course s= (Course)coursesToSelect.get(0);
??????? System.out.println(s.name);
因為類型轉(zhuǎn)換已經(jīng)從語法上通過了,s被認為是Course類對象,不管他實際上是不是,因為你聲明s為Course類對象,如果強制轉(zhuǎn)換錯誤,右邊的才是原罪,s本身是沒有錯的。Course類對象可以調(diào)用name域。
比如:????????? ListTest lt=new ListTest();
??????????????? Object obj=new Object();
?? ??? ?lt=(ListTest)obj;
語法上沒有問題,但是運行時會報錯。
//這樣是不行的,為什么?
??????? System.out.println((Course)coursesToSelect.get(0).name);
我覺得有2種可能,我自己也不太明白:要么是因為靜態(tài)分析是靠某些文件完成的,可能完成不了這種分析,畢竟這里的"."那么多,到底cast誰,要么是承認你的語法沒有問題,但是不真正認為這個強制轉(zhuǎn)換是成功的,不把(Courses)coursesToSelect.get(0)作為Course類對象,因此不允許調(diào)用name。前面成功是因為你是先聲明了一個Course類對象變量s,注意,是聲明了,所以可以調(diào)用name,至于成功與否,還要根據(jù)運行時,s是不是真的是一個Course類對象變量。