JAVA泛型基础
1. 自定义泛型
-
泛型类:
- 具有泛型变量的类
- 在类名后用
代表引入类型 - 多个字母表示多个引入类型如<T, U>等
- 引入类型可以修饰成员变量/局部变量/参数/返回值
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(); }
-
泛型接口:
- 和泛型类相似,在类名后加
- T用来指定方法返回值和参数
- 实现接口时,应该指定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)); } }
- 和泛型类相似,在类名后加
-
java的泛型方法:
- 具有泛型参数的方法
- 该方法可在普通类/泛型类中
在修饰符后,返回类型前
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类型