-
为什么要用泛型?
- 别让猫别站在狗队里
-
Demo
// 下列的增加办法齐全没问题 list.add("one"); list.add(1); // 取的时候, 如果你小心的,也没问题 // 须要强转, 外部是<strong style="color:transparent">来源gaodai#ma#com搞@@代~&码网</strong>以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,?,傻傻分不清?