引入:
在需要使用一种不确定的数据时,可以使用泛型。
例如,需要一个函数可以分别打印int数组和double数组,使用方法重载会存在代码复制,这时就可以使用泛型,来表示不同的数据类型。
使用规则:
- public static <E> void f(),在返回类型之前
- public static <E,F,G> void f(),使用逗号隔开
- public static <E> E f(),返回值也可以为泛型
- 类型参数只能使用引用类型,不是原始类型(char,int,double等)
public static <E,F> F f(E e),代表两个泛型E和F,返回值为F类型,传入参数为E类型。
有四点
- 泛型方法,返回值之前
- 泛型类/接口,类名之后
- 泛型限制类型
public class Demo {
public static void main(String[] args) {
Plate<Apple> p1 = new Plate<Apple>(); //正常
// Plate<Apple> p2 = new Plate<Fruit>(); 两个都是Plate不存在继承关系
//解决办法
Plate<? super Apple> p3 = new Plate<Fruit>(); //表示上界是Apple
}
}
class Fruit{}
class Apple extends Fruit{}
class Plate<T>{}
- 通配符
< ? > 可以传任意类型数据的一种,表示任意数据类型
上界:<? extends A>
下界:<? super B>
注意:
泛型只存在于编译阶段,在运行阶段是已有的数据类型。