What?
所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返
回值及参数类型。简单来说就是在使用的时候已经确定了类型参数。
Why?
-
泛型的好处
-
把运行时期的问题提前到了编译期间
-
避免了强制类型转换
-
How?
1、在集合中使用
ArrayList<Integer> list = new ArrayList<Integer>();
Map<String,Integer> map = new HashMap<>();
2、在方法中使用
//修饰符 <类型> 返回值类型 方法名(类型 变量名) { }
public static <E> List<E> copyFromArrayToList(E[] arr){}
******泛型方法,可以声明为静态的。原因:泛型参数是在调用方法时确定的。并非在实例化类时确定。 ******但是静态方法中不能使用类的泛型。
//以下不是泛型方法
public void setOrderT(T orderT){}
public T getOrderT(){}
3、在接口中使用
//修饰符 interface 接口名<类型> { }
public interface Generic<T> {}
4、自定义泛型
通配符:
-
类型通配符: <?>
-
ArrayList<?>: 表示元素类型未知的ArrayList,它的元素可以匹配任何的类型
-
但是并不能把元素添加到ArrayList中了,获取出来的也是父类类型
-
-
类型通配符上限: <? extends 类型>
-
ArrayListList <? extends Number>: 它表示的类型是Number或者其子类型
-
-
类型通配符下限: <? super 类型>
-
ArrayListList <? super Number>: 它表示的类型是Number或者其父类型
-