Re: [問題] 關於泛型 資料型態的疑問

看板java作者 (LaPass)時間10年前 (2015/05/27 21:21), 編輯推噓1(103)
留言4則, 3人參與, 最新討論串4/6 (看更多)
因為..... java的泛型「是假的」 class A{ String getStr(){ return "A"; } } class B{ String getStr(){ return "B"; } } class C extends A{ String getStr(){ return "C"; } } //下面這段OK List<A> lista; List<C> listc=new ArrayList<>(); listc.add(new C()); //lista = listc; // X lista=(List)listc; //OK A a=lista.get(0); //OK System.out.print(a.getStr()); //印出 C //讓我們反過來試試看,這樣也是ok的 List<A> lista=new ArrayList<>(); List<C> listc; lista.add(new C()); //OK 自動轉型 //listc = lista; // X listc=(List)lista; //OK A a=listc.get(0); //OK System.out.print(a.getStr()); //印出C //編譯OK但是執行不OK List<A> lista=new ArrayList<>(); List<C> listc; lista.add(new A()); //OK 自動轉型 //listc = lista; // X listc=(List)lista; //OK C c=listc.get(0); //編譯OK,執行錯誤 ClassCastException: A cannot be cast to C //再來看一個更驚悚的 List<A> lista=new ArrayList<>(); List<B> listb; listb=(List)lista; //OK listb.add(new B()); //OK.... 慢著,這很明顯有問題啊! B b=listb.get(0); //可是還是被我拿出來了 A a=lista.get(0); //編譯ok,執行時才出錯 ClassCastException: B cannot be cast to A 雖然宣告中的 new ArrayList<>() 的尖括弧中沒東西 但那不影響程式的結果 因為java在運行時根本不會記住那個物件的泛型型別 有用gson的就知道 gson要轉Map,麻煩的很 也是因為沒泛型型別的關係 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.38.79.147 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1432732918.A.800.html

05/27 22:10, , 1F
原來如此
05/27 22:10, 1F

05/28 01:58, , 2F
其實<>那是1.7的語法糖,它是自動從前面的型態推XD
05/28 01:58, 2F

05/28 01:59, , 3F
和runtime清掉泛型資訊沒關係
05/28 01:59, 3F

05/28 11:37, , 4F
最後一例要說沒東西是第三行的cast沒指定...
05/28 11:37, 4F
文章代碼(AID): #1LPSJsW0 (java)
文章代碼(AID): #1LPSJsW0 (java)