-
为什么要用泛型?
- 别让猫别站在狗队里
-
Demo
// 下列的增加办法齐全没问题 list.add("one"); list.add(1); // 取的时候, 如果你小心的, 也没问题 // 须要强转, 外部是以 Object 援用来寄存 String s = (String) list.get(0); int i = (int) list.get(1); // 然而如果, 不小心在获取时 类型判断出错的话 for (int index = 0; index < list.size(); index++) {String str = (String) list.get(index); // index = 1 时, 抛出 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String }
-
泛型的分类
-
泛型类
-
private T obj; public Holder(T t) {obj = t;} public void put(T t) {obj = t;} public T get() {return obj;} }
-
- 泛型接口
-
泛型办法
-
public class Normal { // 成员泛型办法 public <E> String getString(E e) {return e.toString(); } // 动态泛型办法 public static <V> void printString(V v) {System.out.println(v.toString()); } } // 泛型类中的泛型办法 public class Generics<T> { // 成员泛型办法 public <E> String getString(E e) {return e.toString(); } // 动态泛型办法 public static <V> void printString(V v) {System.out.println(v.toString()); } }
-
-
-
泛型的做用
- 可能对类型进行限定
- 在编译期对类型进行查看, 编译时报错
- 对于获取明确的限定类型, 无需进行强制类型转化
- 具备良好的可读性和安全性
-
通配符
-
协变和逆变
- f(⋅) 是逆变(contravariant)的,当 A≤B 时有 f(B)≤f(A) 成立;
f(⋅) 是协变(covariant)的,当 A≤B 时有 f(A)≤f(B) 成立;
- f(⋅) 是逆变(contravariant)的,当 A≤B 时有 f(B)≤f(A) 成立;
-
上界通配符 —— 协变
<? extends>
-
下界通配符 —— 逆变
<? super>
-
-
留神点
- 泛型类中静态方法不能应用泛型参数
- 泛型接口中不能应用类型参数作为成员变量
-
实现原理即类型擦除
- 泛型只是给编译器用来查看类型的
-
参考
- java 泛型深度解读
- Java 中的逆变与协变
- java 泛型 通配符详解及实际
- Java 泛型 T,E,K,V,?,傻傻分不清?