泛型(Generics)基础

概述

  • 泛型类和泛型方法有类型参数,这使得他们可以准确描述用特定类型实例化时会发生什么。如果没有泛型,就将必须使用Object类编写使用于多种类型的代码,这既繁琐,右不安全。

泛型程序设计(generic programming)

意味着编写的代码可以对多种不同类型的对象复用。

类型参数的好处

  1. 可读性
  2. 编译器可以充分利用类型信息,在调用get时不用进行强制类型转换
  3. 编译器现在可以检查,防止插入错误类型的对象

泛型类

public class Pair {
    private T first;
    private E second;

    public Pair() {
        first = null;
        second = null;
    }

    public Pair(T first, E second) {
        this.first = first;
        this.second = second;
    }
}

通过传入具体的类型变量来实例化该泛型类。

public static void main(String[] args) {
        Pair pair = new Pair<>("1",2);
        System.out.println(pair.getFirst());
    }

泛型方法

//注意:类型变量放在修饰符的后面,返回值类型的前面
public static  T getMiddle(T...a){
  return a[a.length/2];
}

泛型接口

public interface IntercaceName{
    T getData();
}
//实现接口时,可以选择指定泛型类型,也可以选择不指定, 如下:
//指定类型:
    public class Interface1 implements IntercaceName {
        private String text;
        @Override
        public String getData() {
            return text;
        }
}
//不指定类型:
    public class Interface1 implements IntercaceName {
        private T data;
        @Override
        public T getData() {
            return data;
        }
}

泛型变量的限定

在使用泛型时, 可以指定泛型的限定区域

//限定泛型必须是某某类的子类或 某某接口的实现类
  //注意:类必须是限定列表的第一个限定

泛型代码和JVM

  1. 类型擦除(虚拟机中没有泛型,只有普通的类和相应的方法)
  2. 所有的类型参数都会替换成他们的限定类型
  3. 会合成桥方法来维持多态()
  4. 为保证类型安全性,必要时会进行强制类型转换

泛型通配符

Pair
Pair
  • 带有超类型的限定的通配符允许你写入一个泛型对象
  • 带有子类型的限定的通配符允许你读取一个泛型对象

你可能感兴趣的:(泛型(Generics)基础)