您的位置:首页 > 编程语言 > Java开发

Java 泛型通配符解释

2017-04-06 16:45 246 查看
前言

最近看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

java泛型 http://www.cnblogs.com/lwbqqyumidi/p/3837629.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java