泛型的引入是为了解决:
java是强类型的,每个变量都必须有它的类型声明,比如 int a=2; Box b = new Box();
但是
0、当一个变量不确定它的类型的时候就得用泛型了,比如:T a; List<?> a; List<E> a;
1、方法内有个属性 或者 是入参和返回值 的类型不确定的时候,
且方法里面包括参数里面只要写了 <X>泛型,方法的返回值或者void前面就必须加 <X> 这种泛型, 但是如果这个X在 本项目内定义过了class X,方法前可以不加,那这个方法里面用的X类型的变量 就只能接受 X 类new的对象,如果X在项目内没有定义,则表示X是泛型,可以接受任何对象,就得在方法前加<X>,不然编译报错 missing type
public static <Box2, E, T> void main(String[] args) {
T a= func(new ArrayList<>());List<E> data2 = getData(new ArrayList<>());// 把<E>写成<?>也行,方法前就不用加<E>了
List<Box2> data1 = getData(new ArrayList<>()); //方法前可以不加<Box2>
}
static <T> T func(List<? extends String> l){
return null;
}
2、类 里面有不确定的类型 的时候,在类名后面加<T>,指代类里面所有用到的T
class Box<T, E> { //这里不能写成Box<?>private T data;
List<?> list;
List<E> list1; //这个E就是new 这个对象的时候指定的类型了
}
3、或者容器里面的元素类型 List<?> List<E> ; 不确定的时候。
注意:
<T> type 一般用在类上 <E> element一般用在list等容器里面 <K,V>用于map。当然也可以随便乱用 大小写都可以。
<?>泛型通配符 一般用于<? extends x> 表示 所有x的子类;<? super x> 表示 所有x的父类
或者用于 List<?> a;但是不能用于 声明变量 ? a ;
public void getData0(Box<?> data){ //这是个方法 } = public <T> void getData1(Box<T> data){ //这是个方法 } //这2种写法使用起来一样