Java基础之泛型

原创
2015/06/04 07:12
阅读数 259

泛型,宽泛的数据类型”

可以接受任意类型(类)的数据。


■泛型定义(类和接口)

类型参数必须是一个合法的标识符,习惯上使用单个大写字母,通常情况下,

K 表示键,

V 表示值,

E 表示元素,

N表示数字,

T 表示一般意义上的数据类型。

例:class Point<TX, TY>


■泛型变量

泛型类在实例化时必须指出具体的类型,也就是向类型参数。

例:

TX x;

TX y;


■泛型实例化

Point<Integer, Integer> p = new Point<Integer, Integer>();

类型擦除

Point p = new Point();


■泛型方法

class UTest {

    public <TX, TY> TX print(TX x, TY y)


public class Point<TX, TY> {

    public TX print(TX x, TY y) {


■泛型界限(上界)

public <TSB extends T1> T getMax(T array[]){

此处的”extends“表示的子类型,不等同于继承。

多重限制范围格式

<T extends A & B & C>

使用“&”分隔。且限制范围中之多有一个类。如果用一个类作为限定,它必须是限定列表中的第一个。


■泛型界限(下界)

<T super A>

注意:不能同时声明上界和下界。


■泛型通配符(?)

使用通配符(?)来代表“任意”未知类型,主要用于与泛型类型无关的定义:

public void print(Point<?, ?> p) {


最常用的就是Class<?>,因为Class<T>并没有依赖于T。

单独一个“?”的也叫无界通配符。

通配符的上界

? extends T 表示泛型的类型参数只能是 T 及其子类。

对于通配符的上界,有以下几点:

(假设给定的泛型类型为G,

(如List<E>中的List),两个具体的泛型参数X、Y,当中Y是X的子类)


G<? extends Y> 是 G<? extends X>的子类型

G<X> 是 G<? extends X>的子类型

G<?> 与 G<? extends Object>等同,如List<?> 与List<? extends Objext>等同。


传入的参数是未知的,所以java为了保护其类型一致,禁止向List<? extends X>添加任意对象,不过却可以添加 null,即list.add(null)是可行的。


通配符的下界

使用通配符(?)不但可以限制类型的上限,还可以限制下限。限制下限使用 super 关键字,例如 <? super TSB> 表示只能接受 TSB 及其父类。

List<Object>与List<?>并不等同,List<Object>是List<?>的子类。还有不能往List<?> list里添加任意对象,除了null。


展开阅读全文
打赏
0
8 收藏
分享
加载中
更多评论
打赏
0 评论
8 收藏
0
分享
返回顶部
顶部