在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ JAVA泛型中通配符到底是什么東西

JAVA泛型中通配符到底是什么東西

比如有這樣一個泛型類

public class Gen<T>{
    
}

然后在其他類中有這樣一個方法

public void showKeyValue(Gen gen){}

public void showKeyValue(Gen<?> gen){}

還有,為什么Gen<Object>和Gen<String>是同一種類(Gen<Object>.Class = Gen<String>.class)
但是Gen<String>卻不能指向Gen<Object>的引用(Gen<Object> gen = new Gen<String>會報錯)
這兩種方法有什么區(qū)別嗎,如果沒有,那么這個的意義在哪呢?
新手,希望能有大神解釋下

回答
編輯回答
傻叼

官方文檔 中有寫這個問題. 這里做一把搬運工, 大致翻譯如下:

無界通配符(unbounded wildcard)在以下兩種場景下使用:

  • 如果你在函數(shù)中需要調用 Object 類中的方法, 比如 toString().
  • 如果代碼不依賴于具體的類型. 典型的例子是 Class<?>: Class<T> 類中的多數(shù)方法都不需要知道 T 的類型.

關于第一種情況的例子, 有如下方法, 用來打印 List 中的元素信息:

public static void printList(List<Object> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

但上面的函數(shù)輸出的是一串內存地址, 而不是 toString() 方法的內容: 它無法正確打印 List<Integer>, List<String> 等列表的值, 因為這些列表并非 List<Object> 的子類型. 使用 List<?> 可以解決這個問題:

public static void printList(List<?> list) {
    for (Object elem: list)
        System.out.print(elem + " ");
    System.out.println();
}

因為 List<A>List<?> 的子類型, 所以上面函數(shù)可以正常打印任何類型的列表:

List<Integer> li = Arrays.asList(1, 2, 3);
List<String>  ls = Arrays.asList("one", "two", "three");
printList(li);
printList(ls);

注意: List<Object>List<?> 也有區(qū)別: 前者可插入任何 Object 子類, 后者只能插入 null, 原因見 官方文檔中的通配符使用指南.


剛剛看到你還有第二個問題. Gen<Object> gen = new Gen<String> 會報錯, 這個問題很好理解: gen.add(new Object()) 這種操作是非法的, 因為新添加的 Object 實例未必是 String 實例.

2017年6月15日 02:43