Java-泛型

282 阅读2分钟

Android 进阶之学好Java

Java作为Android系统开发的基础,目前系统SDK还是使用Java语言,很多第三方库也是使用Java写的;Kotlin也需要编译成Java运行,Java在后台开发中也是一种非常流行的语言,所以Java知识还是要牢牢掌握的。

Java中的泛型

1.为什么需要使用泛型

  • 使用泛型可以在编译期间对类型检测,避免类型转换异常
  • 不需要强制类型转换
  • 代码复用

2.泛型定义的对象

  • 泛型类
  • 泛型方法
  • 泛型接口

3.泛型的使用:

/**
 * 泛型类
 * @param <T>
 */
public class GenericityTest<T> {

    private T key;

    /**
     * 普通方法,泛型在创建类的对象时已经创建
     * @param t
     */
    public void routineGenerivity(T t) {
        this.key = t;
    }

    /**
     * 泛型方法
     *
     * @param <V>
     */
    public <V> V geericityMethod(List<V> list) {
        V v = null;
        if (list != null && list.size() > 0) {
             v = list.get(0);
        }
        return v;
    }

    /**
     * 泛型接口
     * @param <K>
     */
    interface GenericityInterface<K>{

    }
}

4.限定类型变量

有时候我们需要对类型变量加以约束,确保泛型传递的是我们需要的参数;比如:

   public <K extends Comparable<K>> K compare(K a, K b) {
        if (a.compareTo(b) > 0) {
            return a;
        } else {
            return b;
        }
    }

K表示应该绑定的子类型,Comparable表示绑定类型;绑定类型可以是类,也可以是接口。extends左右都允许有多个。如 T,V extends Comparable & Serializable;只允许有一个类,而且如果有类,这个类必须是限定列表的第一个。

5.泛型中的约束和局限性

  • 不能用基本数据类型实例化类型参数;如:List list=new ArrayList<>();
  • 静态域或者静态方法域不能引用泛型实例,静态方法本身是泛型方法可以
  • 创建数组时不能参数化,声明时可以
  • 不能实例化泛型变量
  • 不能捕捉泛型类的实例
  • 泛型类可以继承或者扩展其他泛型类,比如List和ArrayList

6.通配符泛型

  • ? extends X:类型的上限,类型参数必须是X的子类,包括X本身;当使用上限通配符时,可以调用获取数据的get方法,不允许调用set数据方法。? extends X 表示类型的上界,类型参数是X的子类,那么可以肯定的说,get方法返回的一定是个X(不管是X或者X的子类)编译器是可以确定知道的。但是set方法只知道传入的是个X,至于具体是X的那个子类,不知道。
  • ? extends X:类型的下限,类型参数必须是X的超类,包括X本身;可以调用写入数据的set方法,不能调用获取数据的get方法
  • ?:无限定通配符;表示对类型没有什么限制,可以把?看成所有类型的父类