天天看点

java基础之------泛型详解

一、概述

泛型是jdk1.5之后引入的一个新特性,泛型提供了编译时类型安全的检测机制,这个机制允许程序员在编写程序的时候进行非法参数的检测。使用泛型要比使用Object类型要好的多的多,让代码具有了更高的可读性和安全性

泛型就是将原来具体的类型参数化,类似于方法中的变量参数,在使用的时候传入具体的类型

目的: 在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型

1.添加参数的时候可以进行参数的合法性判断

2.获取参数的时候不用进行强制类型的转换

泛型的本质是参数化类型 也就是所有操作的数据被指定为一个参数

一个栗子:

List arrayList = new ArrayList();
arrayList.add("aaaa");
arrayList.add(100);

for(int i = 0; i< arrayList.size();i++){
    String item = (String)arrayList.get(i);
    Log.d("泛型测试","item = " + item);
}      

arrayList在内部维护的是一个Object的数组,就导致他可以存放任意类型,但是自获取的时候就会报错:ClassCastException

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

这样去声明,在添加Integer类型100的时候就会提示异常,这就是泛型

* 注意: java中的泛型只存在于编译阶段,运行阶段程序会采取去泛型化的措施

二、使用

泛型一般使用在:泛型类,泛型接口,泛型方法

1. 泛型类: list,set,map…

具有一个或多个类型变量的类

// 一般用T和U代表: 任意类型   K,V: 代表关键字和值  E:元素类型
public class Pair<T> {
    private T name;
    public Pair() {
    }
    public Pair(T name) {
        this.name = name;
    }
    public T getName() {
        return name;
    }
    public void setName(T name) {
        this.name = name;
    }
}

// 多参数
public class Pair<T,U> { ... }      

实例化:

Pair<String>      

2. 泛型接口:

public interface Generator<T> {
    public T next();
}


// 接口的继承:
// 1.
public class FruitGenerator implements Generator<String> {
    @Override
    public String next() {
        return "Fruit";
    }
}

// 2.
public class FruitGenerator<T> implements Generator<T> {
    private T next;
    public FruitGenerator(T next) {
        this.next = next;
    }
    @Override
    public T next() {
        return next;
    }
    public static void main(String[] args){
        FruitGenerator<String> fruit = new FruitGenerator<>("Fruit");
        System.out.println(fruit.next);
    }
}      

3. 泛型方法:

public class ArrayAlg {
    public static <T> T getMiddle(T... a) {
        return a[a.length / 2];
    }    
    public static void main(String[] args){
        System.out.println(ArrayAlg.getMiddle(1,2,3,4,5));
    }
}      

4. 泛型通配符

Integer是Number的一个子类,那么Generic和Generic是否可以看成具有父子关系的泛型类型呢?

答案是不能的。

同一种泛型可以对应不同的版本,但是不同版本的泛型是不兼容的。

Generic<?>  g ;      

继续阅读