考慮以下片段:
List<Double> doubleList = null;
List<Integer> integerList = null;
List<Number> numberList = null;
//expression:1
List<? super List<? super Integer>> superDoubleList = Arrays.asList(doubleList, integerList,numberList);
//expression:2
//here doubleList will cause compilation error
List<? extends List<? super Integer>> extendsDoubleList = Arrays.asList(integerList,numberList);//doubleList
- 在這里,我試圖了解如何解釋這兩個陳述
- 運算式:1
- 這里我們說 RHS 上的 List 必須是這樣的,該串列的所有元素都滿足條件
? super List<? super Integer> - 但
doubleList/integerList/numberList不無論如何滿足這一條件的-因為我們認為一個型別,是的超型別List<? super Integer>。 - 仍然為什么我們在這里沒有收到編譯錯誤?
- 這里我們說 RHS 上的 List 必須是這樣的,該串列的所有元素都滿足條件
- 運算式:2
- 這里我們期望 RHS 上的元素必須是
subtype of List<? super Integer> - 所以
doubleList直觀上可以看成是滿足條件的候選。 - 如果我包含
doubleList在Arrays.asList運算式中,為什么仍然會出現編譯錯誤?.
- 這里我們期望 RHS 上的元素必須是
- 運算式:1
不確定我是否以正確的方式解釋這些運算式 - 從邏輯上講,它似乎與我上面給出的解釋不符可能有什么問題?
uj5u.com熱心網友回復:
編譯的兩種情況都會編譯,因為型別推斷演算法會盡力推斷asList呼叫的型別引數以使代碼編譯。這與三個串列的型別無關(它們只是間接相關)。這都是關于Arrays.asList回傳的型別。
在第一種情況下:
List<? super List<? super Integer>> superDoubleList = Arrays.asList(doubleList, integerList,numberList);
為了使您的代碼編譯,Arrays.asList只需要創建一個List<List<?>>. 畢竟這三個串列都是“某物的串列”,所以這是可能的。
并且List<List<?>>是一種List<? super List<? super Integer>>。這是因為List<?>是一個超型別List<? super Integer>- “一些Integer超型別的串列”是一種“一些物件的串列”。
對此的另一種解釋是將其? super T視為“消費者T”和? extends T“生產者T”。( PECS ) 在此解釋中,List<? super List<? super Integer>>表示“可以使用可以使用整數的串列的串列”。串列背景關系中的“消費”僅表示“添加”。包含串列可以doubleList,integerList而numberList做到這一點?當然,無論串列的內容是什么,您始終可以將另一個內容添加List<? super Integer>到串列中。只是串列的型別必須是List<List<?>>. 即使這有效:
List<? super List<? super Integer>> superDoubleList =
Arrays.asList(new ArrayList<String>(), new ArrayList<LocalDate>());
使用相同的解釋,List<? extends List<? super Integer>>表示“可以生成消耗整數的串列的串列”。能
Arrays.asList(integerList,numberList)
去做?是的,這兩個內部串列都可以使用整數,因此外部串列可以“生成使用整數的串列”,或者換句話說,是此類串列的生產者。
這份名單怎么樣?
Arrays.asList(doubleList,integerList,numberList)
它是可以使用整數的串列的生產者嗎?嗯,不,因為doubleList不消耗整數,但它可以產生整數。
您可能想知道asList在這種情況下Java 編譯器推斷的型別是什么:
List<? extends List<? super Integer>> extendsDoubleList = Arrays.asList(integerList,numberList);
asList可以創建一個List<List<? super Integer>>. 然而,實際推斷的型別似乎是其他東西,不能用 Java 的語法表達。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/342895.html
