JAVA泛型基础

1. 自定义泛型

  1. 泛型类:

    1. 具有泛型变量的类
    2. 在类名后用代表引入类型
    3. 多个字母表示多个引入类型如<T, U>等
    4. 引入类型可以修饰成员变量/局部变量/参数/返回值
    public class Interval<T> {
    private T lower;
    private T upper;
    
    public Interval(T lower, T upper) {
    	this.lower = lower;
    	this.upper = upper;
    }
    public T getLower() {
    	return lower;
    }
    public void setLower(T lower) {
    	this.lower = lower;
    }
    
     public static void main(String[] args) {		
    	Interval<Integer> v1 = new Interval<>(1, 2);
    	int lower = v1.getLower();
    	int upper = v1.getUpper();
    }
    
  2. 泛型接口:

    1. 和泛型类相似,在类名后加
    2. T用来指定方法返回值和参数
    3. 实现接口时,应该指定T的类型
    public interface Calculator<T> {
    	public T add(T operand1, T operand2);
    }
    
    

    实现类:

     public class IntegerCalculator implements Calculator<Integer> {
    
     public Integer add(Integer operand1, Integer operand2) {
             return operand1 + operand2;
          }
     
         public static void main(String[] args)
         {
             IntegerCalculator c1 = new IntegerCalculator();
             System.out.println(c1.add(1,2));
         }
     }
    
  3. java的泛型方法

    1. 具有泛型参数的方法
    2. 该方法可在普通类/泛型类中
    3. 在修饰符后,返回类型前
     public static <T> Interval<T> getReverse(Interval<T> interval){
         return new Interval<T>(interval.getUpper(), interval.getLower());
     }
    

2. 泛型类型限定

  • T extends Comparable继承和实现接口都采用comparable
  • 可以有多个,以&拼接,如<T extends Comparable&Serializable>,可以有多个接口但是只有一个类,类在第一位
  • 逗号隔参数,<T extends File & Cloneable, U extends Serializable>

上界限定符:

Pair<? extend S>:

  • pair能接受的参数类型,是S自身或子类。

下限界定符:

Pair<? super S>:

  • pair能接受的类型参数,是S的自身或者超类。
  • 只能set/不能get

泛型PECS原则:
Producer Extends,Consumer Super

  • 从泛型类中读取类型T的数据,不能写入,使用? extends
  • 写入不能读取使用? super通配符,
  • 既写入又读出不使用通配符

无限定类型的泛型:
pair<?>无限定通配符,表示任意类型

3. 泛型实现的本质

在class文件没有泛型概念,jvm采取类型擦除,JVM里面没有泛型对象,而是采用类型擦除技术,
只有普通的类和方法,无限定类型时所有泛型都会变为object类型

原文地址:https://www.cnblogs.com/innndown/p/12361656.html