【Java】泛型

来源:互联网 发布:编程任务分解图示 编辑:程序博客网 时间:2024/05/06 15:08

为什么有泛型?因为想要编写出与类型无关的代码,在运行时可以指定类型。java在泛型之前,是通过Object来实现类型无关的代码的。但是有两个问题。一个是可能会有类型错误,比如说定义了一个List存String,但是在别的地方,可能有人会往里面放入一个Integer,这时在遍历的时候会强转,最后报类型转换错误。另一个问题时每一次都要强转。

但是使用了泛型,上面的问题就全部消失了,我们不需要自己强转,而且编译时可以发现类型错误。

泛型不存在父类子类关系。List<Object>不能被List<String>赋值。语义级别的原因可能是既然我们是先构建了List<String>,那么里面存的都是String,最后遍历也是要用String遍历,而不是object,此时因为我们是要用子类的,那么就需要强转,这本身就违背了泛型的设计初衷,而且,如果add了别的子类就会强转失败。

如果想要使用父类,那么需要使用通配符。

使用通配符的泛型,只能取值而不能加入,因为泛型检查是在编译时进行的,而编译时还不知道?是什么类型,只有运行时才知道。所以编译不通过。只有指定了具体的类型才知道。

泛型底层是会擦除类型的,就是在编译完以后是没有泛型类型的,类型检测是在编译完成之前就做的。编译完的字节码会多几条指令做类型强转。所以使用反射可以破坏泛型。


补充:

为什么定义泛型类的时候我们无法操作T,比如调用方法或者new一个实例。因为T在编译时时无法知道的,只有在运行时才能够知道,这样的话,编译器在编译时做检查的时候就无法知道T是什么类型,所以我们在定义泛型类是不能使用T的任何方法的。


<?>和<T>有什么区别,个人觉得要搞清楚这个问题,必须明白泛型使用时的两个时机,一个是定义一个是使用。T是在定义泛型类时使用的,相当于一个占位符,而?是在使用时出现的,用于声明一个泛型的变量类型,这是编译器就会检查这一条赋值语句,看后面赋值的变量是否符合声明的泛型类型。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 支付宝违规限制怎么办 微信转账不还钱怎么办 碳放久了不爱起火怎么办 闻碳火时间久了怎么办 被代运营诈骗怎么办 被上海聚连骗了怎么办? 蓝领贷逾期半年怎么办 淘宝店倒闭售后怎么办 淘宝店铺宝贝被下架怎么办 医院被托管编制怎么办 领码分百万账号异常怎么办 拼多多帐号异常怎么办 qq钱包交易异常怎么办 托管公司跑了怎么办? 花呗退款没到账怎么办 车辆过户了车牌怎么办 货车资格证脱审怎么办 廉租房夫妻离婚怎么办 二手车行驶证怎么办的? 卖二手车后车牌怎么办 房子动迁没过户怎么办? 北京买车指标怎么办 签合同不交社保怎么办 养老保险交重了怎么办 公司克扣员工工资应该怎么办 天猫拒绝退款怎么办 一看书就犯困怎么办 擦了风油精过敏怎么办 擦了清凉油过敏怎么办 脸上擦风油精过敏怎么办 搽了风油精过敏怎么办 背带裤显屁股大怎么办 打底衫肥了怎么办 天猫卖家总是发信息怎么办 房子装修完有味怎么办 房子装修油漆味怎么办 房子装修代款怎么办 房子要装修不懂怎么办 手机淘宝没地区怎么办 qq有不良记录怎么办 账号有不良记录怎么办