泛型的详解
来源:互联网 发布:淘宝水印美图秀秀教程 编辑:程序博客网 时间:2024/05/16 14:16
为什么需要使用泛型:
1、存储任意类型的数据在集合中,但是取出来都是Object类型的,此时就得强转;
2、约束存储到集合中的元素必须是相同数据类型(相同的数据类型才能做比较,比如TreeSet类);
泛型(GenericType),从Java5开始支持新的语法:
什么是泛型:
1、广泛使用的类型;
2、代码模板中类型不确定,谁调用该段代码,谁就指明类型。
泛型类:直接在类/接口上定义的泛型。
使用泛型:保证前后类型相同
List<String> list = new ArrayList<String>(); //该集合中只能存储String类型的元素。
因为前后类型相同,所以Java7开始推出泛型的菱形语法<>。
List<String> list = new ArrayList<>();
泛型不存在继承关系(错误如下):
List<Object> list = new ArrayList<String>();//错误的
从此以后,使用集合都得使用泛型来约束该集合中元素的类型。
其实通过反编译你会发现,泛型其实也是语法糖,底层依然没有泛型,而且依旧是强转。
泛型方法:在方法上声明泛型。
情况1:泛型类中的泛型只能使用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法;
情况2:泛型类中的泛型应该适用于整个类中多个方法,有时候只对某个方法设置泛型即可。
一般的,把自定义的泛型作为该方法的返回类型才有意义,而且此时的泛型必须是由参数设置进来的。
如果没有参数来设置泛型的具体类型,此时的方法一般返回设计为Object即可。
泛型的通配符,以及上限和下限:
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知,通配符。
1、存储任意类型的数据在集合中,但是取出来都是Object类型的,此时就得强转;
2、约束存储到集合中的元素必须是相同数据类型(相同的数据类型才能做比较,比如TreeSet类);
3、假设设计一个点(Point)类,来封装坐标位置,要求坐标位置支持String类型,Integer类型和Double类型。这种情况就会出现重复定义。
重复定义:
public class Point1{private String x;private String y;}public class Point2{private Integer x;private Integer y;}public class Point3{private Double x;private Double y;}
泛型(GenericType),从Java5开始支持新的语法:
什么是泛型:
1、广泛使用的类型;
2、代码模板中类型不确定,谁调用该段代码,谁就指明类型。
泛型类:直接在类/接口上定义的泛型。
使用泛型:保证前后类型相同
List<String> list = new ArrayList<String>(); //该集合中只能存储String类型的元素。
因为前后类型相同,所以Java7开始推出泛型的菱形语法<>。
List<String> list = new ArrayList<>();
泛型不存在继承关系(错误如下):
List<Object> list = new ArrayList<String>();//错误的
从此以后,使用集合都得使用泛型来约束该集合中元素的类型。
其实通过反编译你会发现,泛型其实也是语法糖,底层依然没有泛型,而且依旧是强转。
泛型方法:在方法上声明泛型。
情况1:泛型类中的泛型只能使用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法;
情况2:泛型类中的泛型应该适用于整个类中多个方法,有时候只对某个方法设置泛型即可。
一般的,把自定义的泛型作为该方法的返回类型才有意义,而且此时的泛型必须是由参数设置进来的。
如果没有参数来设置泛型的具体类型,此时的方法一般返回设计为Object即可。
public static <T> T doWork(T val){ //TODO return val;}
泛型的通配符,以及上限和下限:
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知,通配符。
此时只能接收数据,不能往该集合中存储数据:
public static void main(String[] args) {List<Integer> list1 = new ArraysList<>();doWork(list1);List<String> list2 = new ArraysList<>();doWork(list2);}private static void doWork(List<?> list) {// TODO}
泛型的上下限非常少使用到,这里只是简单的说明一下:
泛型的上限和下限,用来限定元素类型必须是X类的子类或相同,X类的父类或相同。
泛型擦除和转换:(泛型的擦除)
1、泛型编译之后就消失(泛型自动擦除);
2、当把带有泛型的集合赋给不带泛型的集合,此时泛型被擦除(手动擦除)。
阅读全文
0 0
- 泛型的详解
- Java泛型的详解
- Java 泛型的详解
- C# 的泛型详解
- Java 泛型的详解
- JAVA的泛型详解上篇
- java 泛型的详解解
- Java泛型详解,通俗易懂的写法
- 泛型类型Type的详解
- Java泛型详解
- 泛型详解
- java泛型详解
- C#泛型详解
- C#泛型详解
- java泛型详解
- Java泛型详解
- C#泛型详解
- Java泛型详解
- 迭代器的简单说明
- Makefile
- Linux系统中软链接和硬链接的区别
- java关于时间处理的函数
- Maximum Product of Three Numbers问题解法
- 泛型的详解
- poj 2653 Pick-up sticks【线段相交】
- Waiting for table metadata lock
- C语言-求两个日期之间的距离
- 关于char *str[]与 char str[]的区别
- Splay树(伸展树)
- mybatis-架构
- 畅通工程
- 第一课、课程简介