#1.爲何要使用泛型?
1.解決元素存儲的安全性問題。
在一個list鍾,我原本只但願存儲String類型的對象,可是沒有使用泛型時,Object類對象能夠存儲進去。這就形成list中元素類型不一致。
2.解決獲取元素數據時,須要類型強轉的問題。
在如上list中獲取元素數據時,很明顯獲取String類型時,須要強轉String;獲取Object元素時,須要強轉Object。
使用了泛型,1.就規定了list中存放元素的類型;2.取出元素時,不須要作類型轉換。安全
public void testGeneric() { /** * 不使用泛型 */ List list = new ArrayList<>(); list.add(78); list.add(85); list.add(69); //1.不安全元素進來了 list.add(new String("AA")); for (int i = 0; i < list.size(); i++) { //2.強轉出現問題 int score = (int) list.get(i); System.out.println(score); } /** * 使用泛型 */ List<Integer> list2 = new ArrayList<>(); list2.add(78); list2.add(85); list2.add(69); //不安全元素進不來 //list2.add(new String("AA")); for (int i = 0; i < list2.size(); i++) { //2.強轉出現問題 int score = list2.get(i); System.out.println(score); } }
#2.自定義泛型類、泛型接口、泛型方法code
/** * 自定義泛型類 * */ public class Order<T> { private int orderId; private String orderName; private T t; private List<T> list; //用上面自定義的t public void add() { list.add(t); } //自定義泛型方法 //傳入什麼類型元素,就輸出什麼類型元素 public <E> E getE(E e) { return e; } }
使用自定義泛型類對象
public void testGeneric() { Order<String> order = new Order<>(); order.setOrderId(1001); order.setOrderName("張三"); order.setT("講故事"); System.out.println(order); order.setList(new ArrayList<>()); //將order.getT()的值添加到order的list屬性中 order.add(); System.out.println(order); //接收數據類型必須與傳入數據類型一致 int tmp = order.getE(123); System.out.println(tmp); }
#3.通配符接口
public void testGeneric() { //這裏?表明通配符 //便可以表明任何類型 List<?> list = null; List<Integer> list1 = new ArrayList<>(); List<String> list2 = new ArrayList<>(); list = list1; list = list2; }