第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

郎朗坤 2019-07-17 14:17:14
泛型方法上的多個通配符使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!     }}這兩個通配符是不相關(guān)的,這就是為什么您可以調(diào)用doNothing帶著List<String>和一個List<Integer>..換句話說,這兩個?可以引用完全不同的類型。因此,以下內(nèi)容不編譯,這是預(yù)期的(也在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中,但是它應(yīng)該嗎?難道我們不可能List<List<Integer>> lol和一個List<String> list,類似的兩個不相關(guān)的通配符情況TwoListsOfUnknowns?實(shí)際上,以下對這個方向的輕微修改并不是編譯的,這是預(yù)期的(如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所以這不應(yīng)該編譯,對吧
查看完整描述

3 回答

?
ibeautiful

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個贊

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

讓我們將您的示例更改為類似的內(nèi)容,但使用更有區(qū)別的類型:

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

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

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

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

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

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


查看完整回答
反對 回復(fù) 2019-07-17
  • 3 回答
  • 0 關(guān)注
  • 368 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號