作者LaPass (LaPass)
看板java
標題Re: [問題] 關於泛型 資料型態的疑問
時間Wed May 27 21:21:56 2015
因為.....
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
→ dreamnook: 原來如此 05/27 22:10
推 Frozenmouse: 其實<>那是1.7的語法糖,它是自動從前面的型態推XD 05/28 01:58
→ Frozenmouse: 和runtime清掉泛型資訊沒關係 05/28 01:59
→ Chikei: 最後一例要說沒東西是第三行的cast沒指定... 05/28 11:37