比如有這樣一個泛型類
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)在以下兩種場景下使用:
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 實例.
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。