前言
最近看Rxjava retrofit 中到处都是泛型类型定义,不得不重新整理一下资料,简单介绍,满足基本理解使用。
定义什么是泛型?
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
一 java通配符 <T>,<E>,<K,V>,<?>
使用"<T>"
来声明类型持有者名称,自定义泛型类时,类持有者名称可以使用T(Type),如果是容器的元素可以使用E(Element),若键值匹配可以用K(Key)和V(Value)等,若是<?>
,则是默认是允许Object及其下的子类,也就是java的所有对象了。
二 泛型类型限制写法上下界
Java上界通配符 <? extends Fruit>
Java 下界通配符 <? super Fruit>
Eg:
上界通配符
public static void upMethod(List<? extends Fruit> list){
//编译报错
//使用通配符后,不能在往集合类中添加元素
//list.add(); //使用通配符后,是可以取出元素的
//所有取出的元素,都是上界父类元素
Fruit fruit = list.get(0);
}
下界通配符
public static void downMethod(List<? super Fruit> list){
//下界通配符可以往容器内添加元素
//但是有限制,必须是Fruit的子类或者本身,父类是添加不进去的
list.add(new Apple());
//取出元素的类型都为Object
Object object = list.get(0);
}
class Box<T> {
private T data;
public Box() {
}
public Box(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
里面所有 T 标识,表示接收外部传递类型参数
Eg: new Box<String>(); new Box( “ 我是泛型T”)
里面的<T> 表示String类型
泛型方法
不带返回值
public Box(T data) {
this.data = data;
}
带返回值
Public T Box(T data) {
Return data;
}
Eg:
public final static <T> Observable<T> create(OnSubscribe<T> f) {
return new Observable<T>(hook.onCreate(f));
}
这里查看Rxjava泛型方法定义
public final static <T> Observable<T> create(OnSubscribe<T> f) {
return new Observable<T>(hook.onCreate(f));
}
- 泛型方法必须加标识
- Observable 泛型返回类型
- OnSubscribe f 泛型T的类型
- f 泛型类型
泛型参数
Box(T data)
说明一下,定义泛型方法时,必须在返回值前边加一个,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值。
OnSubscribe的作用就是指明泛型的具体类型,而OnSubscribe类型的变量t,可以用来创建泛型类的对象。
当然,泛型方法不是仅仅可以有一个参数OnSubscribe,可以根据需要添加其他参数。
为什么要使用泛型方法呢?因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。
定义泛型方法语法格式如下:
调用泛型方法语法格式如下:
引用
泛型 http://www.cnblogs.com/iyangyuan/archive/2013/04/09/3011274.html