泛型方法上的多個通配符:Java 編譯器難題
簡介
Java 泛型中、通配符(*)代表未知型別。當在泛型方法上使用多個通配符時,可能會導致混亂和意外行為。本文探討了多個通配符的複雜性及其對 Java 類型安全性的影響。
混亂
考慮以下程式碼:
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! } }</integer></string>
doNothing 中的兩個通配符看起來不相關,允許您使用List
static void doSomethingIllegal(List> list1, List> list2) { list1.addAll(list2); // DOES NOT COMPILE!!! }
這表明雖然 list1 和 list2 可以是不同的類型,但它們可能存在某種連接,無法直接使用。
嵌套通配符的混亂
進一步調查發現,混亂不在於多個通配符,而在於嵌套通配符:
public class LOLUnknowns1 { static void probablyIllegal(List<list>> lol, List> list) { lol.add(list); // this compiles!! how come??? } }</list>
即使list 可能是與lol 元素不同的類型,此程式碼編譯也不會出現錯誤。但是,需要注意的是,這種情況會引發有關類型安全的問題。
真相:捕獲轉換
這種混亂源自於稱為捕獲轉換的概念。它允許某些通配符在泛型方法中使用時捕獲特定類型。這就是為什麼下面的 possibleIllegal 變體可以編譯:
static void probablyIllegalAgain(List<list extends number>> lol, List extends Number> list) { lol.add(list); // compiles fine!!! how come??? }</list>
這裡,lol 中的通配符可以捕獲擴展 Number 的類型,例如 List
理解嵌套通配符
關鍵要點是多個通配符本身沒有問題。當嘗試使用嵌套通配符捕獲由於類型差異而不“相容”的類型時,會出現混亂。
對於 LOLUnknowns1,List> 中的巢狀通配符是無法捕獲特定類型,因為捕獲對於 lol 的所有可能元素類型來說並不安全。這就是為什麼 list 可以是任何類型,從而導致潛在的類型安全問題。
結論
泛型方法上的多個通配符可能會令人困惑,但了解捕獲轉換和它的局限性至關重要。嵌套通配符需要仔細考慮以確保類型安全。透過遵守這些原則,您可以了解 Java 泛型的複雜性並編寫健全的程式碼。
以上是為什麼 Java 中泛型方法上的多個通配符會導致混亂?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Java'splatFormIndependecemeansDeveloperScanWriteCeandeCeandOnanyDeviceWithouTrecompOlding.thisAcachivedThroughThroughTheroughThejavavirtualmachine(JVM),WhaterslatesbyTecodeDecodeOdeIntComenthendions,允許univerniverSaliversalComplatibilityAcrossplatss.allospplats.s.howevss.howev

要設置JVM,需按以下步驟進行:1)下載並安裝JDK,2)設置環境變量,3)驗證安裝,4)設置IDE,5)測試運行程序。設置JVM不僅僅是讓其工作,還包括優化內存分配、垃圾收集、性能調優和錯誤處理,以確保最佳運行效果。

toensurejavaplatFormIntence,lofterTheSeSteps:1)compileAndRunyOpplicationOnmultPlatFormSusiseDifferenToSandjvmversions.2)upureizeci/cdppipipelinelikeinkinslikejenkinsorgithikejenkinsorgithikejenkinsorgithikejenkinsorgithike forautomatecross-plateftestesteftestesting.3)

javastandsoutsoutinmoderndevelopmentduetoitsrobustfeatureslikelambdaexpressions,streams,andenhanced concurrencysupport.1)lambdaexpressionssimplifyfunctional promprogientsmangional programmanging,makencodemoreconciseandable.2)

Java的核心特點包括平台獨立性、面向對象設計和豐富的標準庫。 1)面向對象設計通過多態等特性使得代碼更加靈活和可維護。 2)垃圾回收機制解放了開發者的內存管理負擔,但需要優化以避免性能問題。 3)標準庫提供了從集合到網絡的強大工具,但應謹慎選擇數據結構以保持代碼簡潔。

Yes,Javacanruneverywhereduetoits"WriteOnce,RunAnywhere"philosophy.1)Javacodeiscompiledintoplatform-independentbytecode.2)TheJavaVirtualMachine(JVM)interpretsorcompilesthisbytecodeintomachine-specificinstructionsatruntime,allowingthesameJava

jdkincludestoolsfordEveloping and compilingjavacode,whilejvmrunsthecompiledbytecode.1)jdkcontainsjre,編譯器,andutilities.2)

Java的關鍵特性包括:1)面向對象設計,2)平台獨立性,3)垃圾回收機制,4)豐富的庫和框架,5)並發支持,6)異常處理,7)持續演進。 Java的這些特性使其成為開發高效、可維護軟件的強大工具。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

禪工作室 13.0.1
強大的PHP整合開發環境

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

記事本++7.3.1
好用且免費的程式碼編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器