【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是在定义泛型类时使用的,相当于一个占位符,而?是在使用时出现的,用于声明一个泛型的变量类型,这是编译器就会检查这一条赋值语句,看后面赋值的变量是否符合声明的泛型类型。
- 【java 2】java泛型
- Java 泛型 Java generic
- Java Tutorials_Generics(java泛型)
- Java基础 Java 泛型
- java 泛型
- java泛型
- Java泛型
- Java泛型
- java泛型
- java泛型
- java泛型
- Java 泛型
- Java泛型
- Java 泛型
- JAVA 泛型
- java 泛型
- java泛型
- Java泛型
- 23岁出道就演主角,主演电影55亿票房!身价翻番火遍中外!
- hdu 5755 Gambler Bo 三进制高斯消元(开关问题变形)
- Invalid bound statement (not found)-Mybatis在idea中错误
- 好事将近?唐艺昕带男友张若昀见爸妈
- react-native-image-crop-picker记录学习
- 【Java】泛型
- bzoj 1682: [Usaco2005 Mar]Out of Hay 干草危机(最小生成树)
- 章子怡一家四口同框 小苹果牵着醒醒好温馨
- Linux系统目录结构以及简单说明
- HDU 5893 List wants to travel 树链剖分求区间不同段个数
- Axure8.1.0.335的注册码
- linux学习(三)
- 弹性分布式数据集RDD
- 明星慈善夜众星云集 张若昀唐艺昕首度同台