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

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

錯誤的論點:為什么 List<List<>> 不等于 List<Object>?

錯誤的論點:為什么 List<List<>> 不等于 List<Object>?

冉冉說 2023-07-19 17:13:30
以下代碼給我一個編譯錯誤:public static Function<int[], Stream<Tuple2<Formatter, List<Object>>>> acquisitionColors = (col) -> Seq.of(            Tuple.tuple(Formatter.COLOR,                    Seq.of(                            Seq.of(col).toList(),                            Seq.of(                                    Seq.of("Stop", "Stoq", null, "red").toList(),                                    Seq.of("Learning", "Learninh", null, "gray").toList(),                                    Seq.of("Stop", "Stoq", null, "red").toList(),                                    Seq.of("Reduce", "Reducf", null, "orange").toList(),                                    Seq.of("Keep", "Keeq", null, "green").toList(),                                    Seq.of("Increase", "Increasf", null, "blue").toList()                            ).toList()                    ).toList()            )    );Wrong 2nd argument type. Found: 'java.util.List<java.util.List<? extends java.lang.Object>>', required: 'java.util.List<java.lang.Object>' Inspection info:  tuple (Formatter,java.uti.List<java.lang.Object>) in Tuple cannot be applied to (Formatter,java.util.List<java.util.List<? extends java.lanq.Object>>)但是,如果我用 a 包裝該列表Collections.singletonList,它會起作用:public static Function<int[], Stream<Tuple2<Formatter, List<Object>>>> acquisitionColors = (col) -> Seq.of(            Tuple.tuple(Formatter.COLOR,                    Collections.singletonList(                     ...                    ).toList())            )    );為什么會發生這種情況?
查看完整描述

3 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

為什么我不能投射 a?List<List<Object>>to?List<Object>?不是List<Object>Object嗎?

因為Java 泛型不是隱式多態的。。List<Object>意味著它可以Object在給定列表中包含任何內容,甚至是 a?Map<?, ?>,但是當您將其轉換為 a 時List<List>,包含任何內容不再有意義Object,并且僅限于List

使用時效果如何Collections.singletonList()?

僅僅是因為按照文檔Collections.singletonList()返回 a?,所以編譯器不會在運行時抱怨它。


查看完整回答
反對 回復 2023-07-19
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

答案的兩部分:?List<Object>是不變的,因此鍵入的表達式List<List<? extends java.lanq.Object>>不能分配給List<Object>?Google 以獲取 Java 中的方差,例如:?DZone 關于 Java 中方差的文章

public static <T> List<T> singletonList(T o)是一個通用方法。對于泛型方法,應用類型推斷。在您的上下文中,T 應該是一個對象,并且List<List<? extends java.lanq.Object>>可以轉換為對象。


查看完整回答
反對 回復 2023-07-19
?
搖曳的薔薇

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

您應該看看 Java 中的類型擦除和原始類型。


列表使用泛型,因此當您嘗試使用定義原始類型創建列表時,它會使用Object


List list;

// means that list holds Objects


List<String> listOfStrings;

// means that list holds Strings

現在的情況是List<List>


列表是一個interface沒有合適的轉換的對象,因為Object在評估此語句時,JVM 會注意到您嘗試使用既不是對象也不是“它的子對象”的項目


List<List<? extends java.lanq.Object>> // (Object or children of it)


查看完整回答
反對 回復 2023-07-19
  • 3 回答
  • 0 關注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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