Re: [问题] 关于泛型 资料型态的疑问

楼主: LaPass (LaPass)   2015-05-27 21:21:56
因为.....
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,麻烦的很
也是因为没泛型型别的关系
作者: dreamnook (亚龙)   2015-05-27 22:10:00
原来如此
作者: Frozenmouse (*冰之鼠*)   2015-05-28 01:58:00
其实<>那是1.7的语法糖,它是自动从前面的型态推XD和runtime清掉泛型资讯没关系
作者: Chikei ( )   2015-05-28 11:37:00
最后一例要说没东西是第三行的cast没指定...

Links booklink

Contact Us: admin [ a t ] ucptt.com