亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

泛型方法上的多個通配符使Java編譯器(還有我!)很迷茫

泛型方法上的多個通配符使Java編譯器(還有我!)很迷茫

C++
慕斯王 2019-12-18 18:13:25
泛型方法上的多個通配符使Java編譯器(還有我!)很迷茫讓我們首先考慮一個簡單的場景(見ideone.com上的完整源代碼):import java.util.*;public class TwoListsOfUnknowns {     static void doNothing(List<?> list1, List<?> list2) { }     public static void main(String[] args) {         List<String> list1 = null;         List<Integer> list2 = null;         doNothing(list1, list2); // compiles fine!     }}這兩個通配符是不相關的,這就是為什么您可以調用doNothing帶著List<String>和一個List<Integer>..換句話說,這兩個?可以引用完全不同的類型。因此,以下內容不編譯,這是預期的(也在ideone.com上):import java.util.*;public class TwoListsOfUnknowns2 {     static void doSomethingIllegal(List<?> list1, List<?> list2) {         list1.addAll(list2); // DOES NOT COMPILE!!!             // The method addAll(Collection<? extends capture#1-of ?>)             // in the type List<capture#1-of ?> is not applicable for             // the arguments (List<capture#2-of ?>)     }}到目前為止還不錯,但事情開始變得很混亂。如ideone.com所見):import java.util.*;public class LOLUnknowns1 {     static void probablyIllegal(List<List<?>> lol, List<?> list) {         lol.add(list); // this compiles!! how come???     }}上面的代碼是在Eclipse中為我編譯的sun-jdk-1.6.0.17在ideone.com中,但是它應該嗎?難道我們不可能List<List<Integer>> lol和一個List<String> list,類似的兩個不相關的通配符情況TwoListsOfUnknowns?實際上,以下對這個方向的輕微修改并不是編譯的,這是預期的(如ideone.com所見):import java.util.*;public class LOLUnknowns2 {     static void rightfullyIllegal(             List<List<? extends Number>> lol, List<?> list) {         lol.add(list); // DOES NOT COMPILE! As expected!!!             // The method add(List<? extends Number>) in the type             // List<List<? extends Number>> is not applicable for             // the arguments (List<capture#1-of ?>)     }}所以看起來編譯器正在做它的工作,但是我們得到了這個(如ideone.com所見):import java.util.*;public class LOLUnknowns3 {     static void probablyIllegalAgain(             List<List<? extends Number>> lol, List<? extends Number> list) {         lol.add(list); // compiles fine!!! how come???     }}再一次,我們可能有List<List<Integer>> lol和一個List<Float> list所以這不應該編譯,對吧
查看完整描述

3 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

不是專家,但我想我能理解。

讓我們將您的示例更改為類似的內容,但使用更有區別的類型:

static void probablyIllegal(List<Class<?>> x, Class<?> y) {
    x.add(y); // this compiles!! how come???}

讓我們把清單改為[],以便更有啟發性:

static void probablyIllegal(Class<?>[] x, Class<?> y) {
    x.add(y); // this compiles!! how come???}

現在,x是一列一些班級類型。它是一個數組任何班級類型。它可以包含一個Class<String>  a Class<Int>..這不能用普通類型參數表示:

static<T> void probablyIllegal(Class<T>[] x  //homogeneous! not the same!

Class<?>是一種超級類型的Class<T>任何 T..如果我們認為類型一組對象 Class<?>是所有人的聯合Class<T>為所有人T..(它包括它自己嗎?我不知道.)



查看完整回答
反對 回復 2019-12-19
  • 3 回答
  • 0 關注
  • 458 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號