Java核心类库—集合框架—泛型操作

泛型(GenericType),从Java5开始支持的新的语法语言:

什么是泛型:

1.广泛通用的类型

2.代码模块中类型不确定,调用该段代码,谁指明类型是什么

 

泛型类:直接在类/接口上定义的泛型

使用泛型:

  保证前后类型相同

  List<String> list = new ArrayList<String>();//该List集合中只能存储String类型的元素

  因为前后类型相同,所以java7开始,推出泛型的菱形语法

  List<String> list = new ArrayList<>();

  泛型不存在继承的关系(错误如下)

  List<Object> list = new ArrayList<String>();//错误的

  从此以后,使用集合都得使用泛型来约束该集合中的元素类型

  通过反编译发现:泛型其实也是语法糖,底层依然没有泛型,而且依然使用强转。

 

泛型方法:在方法上声明泛型

情况1:泛型类中的泛型只能适用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法

情况2:泛型类中的泛型应该适用于整个类中的多个方法,有时候只对某一个方法设置泛型即可

一般的,把自定义的泛型作为该方法的返回类型才有意义,而且此时的泛型必须由参数设置进来的,如果没有参数来设置泛型的具体类型,此时的方法一般返回设计为Object即可。

 

泛型通配符

泛型通配符:不知道使用什么类型来接受的时候,此时可以使用?,?表示未知,通配符

此时只能接收数据不能往集合中存储数据。

 

泛型的上限和下限:用来限定元素的类型必须是x类的子类或相同,x的父类或相同。

例如:? extends Number上限,? super Number下限

 

泛型擦除和转换:

泛型的擦除:

  1.泛型编译之后就消失了(泛型自动擦除)

  2.档把带有泛型的集合付给不带泛型的集合,此时泛型被擦除(手动擦除)

堆污染:

  单一个方法既使用泛型的时候也可以使用可变参数,此时容易导致堆污染问题

如:在ArrayList类中的asList方法:public static <T> List<T> asList(T..a)

posted @ 2017-03-18 18:33  wenxudong  阅读(244)  评论(0编辑  收藏  举报