java泛型

泛型简介 

泛型是来约束一个类/方法/接口所能存储的类型。指定传入接口/类/方法的类型参数,也就是泛型。泛型==约束,使用<>来约束。注:泛型的类型必须是引用类型,基本类型不能泛型。

泛型的使用

最最常见的泛型使用就是List,我们每次创建list的时候都使用了泛型。如下:

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

规定这个集合只能传入String类型,这就是泛型的一种使用。

泛型也支持多类型,例如最常见的map

HashMap<String, Integer>

传入的时候则需要传入约定的值。

泛型的好处

1. 提高安全性,将运行期的错误转换到编译器,如果我们传入的值不符合泛型,则会编译报错。

2. 存取值的时候省取了强制类型转换的麻烦及不确定性。

泛型的规范

其实泛型的类型参数你可以取任何名字,但最好是单个大写字母,下面是一些约定俗称规范:当然不同公司有不同规范。

  • E - Element (在集合中使用,因为集合中存放的是元素)
  •  T - Type(Java 类)
  •  K - Key(键)
  •  V - Value(值)
  •  N - Number(数值类型)
  •  S、U、V  - 2nd、3rd、4th types

有界类型

     当我们希望对泛型的类型参数进行限制的时候,可以使用有界类型(Bounded Type Parameters)有界类型参数使用extends关键字后面接上边界类型来表示,注意:这里虽然用的是extends关键字,却不止限制继承了父类,也可以指实现了接口类。

 1 package beanCopy;
 2 /**
 3  * 有界类型
 4  * @author wanghao
 5  *
 6  */
 7 public class BoundedType {
 8     private String name;
 9     private int age;
10     public String getName() {
11         return name;
12     }
13     public void setName(String name) {
14         this.name = name;
15     }
16     public int getAge() {
17         return age;
18     }
19     public void setAge(int age) {
20         this.age = age;
21     }
22     public <T extends Number> void checkBoundedType(T t) {
23         System.out.println("你输入的是:"+ t);
24     }
25     
26 }

上面的最后一个方法,限制传入的类型为Number或Number的子类

public <T extends Number> void checkBoundedType(T t) {

 

下面是测试类:

因为泛型为必须是Number或Number的子类,所以Boolean放入时,后编译报错。

有界泛型的好处,就是可以调用其父类的方法。

 如:

有界泛型也可以多层限制,如下:

用&链接,<T extends A & B & C>
但是多边界使用时其实只能继承一个父类, 并且要将他写在第一个位置上. 其他的都是其实现的接口,

通配符泛型及受限泛型

通配符泛型即无边界泛型,使用?表示。

无边界的通配符,主要是接收不确定的数据。

通配符泛型与基本泛型的区别,

 

固定上边界泛型

固定上边界的通配符泛型,能够接受其类型与其子类类型数据,采用<? extends E>的形式,这里的E就是该泛型的上臂娜姐,即:类型继承体系除Object的最高点,找个最常用的类吧,List里面的add方法就是使用了上边界泛型。

addAll,合并集合,使用上边界泛型,限制合并集合的泛型必须是本集合的子类或者本身。这样就可以保证集合里面的元素类型一一致。

 固定下边界的通配符

使用固定下边界的通配符,能够接受指定类及其父类类型的数据。采用< ? super E>的形式,这里的E就是该泛型的下边界。

注意:你可以为一个泛型指定上边界或下边界,但是不能同时指定上下边界。

例如:

 

posted @ 2018-05-01 03:02  苦心明  阅读(187)  评论(0)    收藏  举报