[英]Create a multidimensional generic array of Optionals
我想創建一個包含 Optionals 的二維數組(是的,我知道這實際上是一個數組數組)。 通用數組創建的正常方法不起作用,因為它因 ClassCastException 而失敗。 這是我的代碼:
@SuppressWarnings("unchecked")
Optional<Integer>[][] arr = (Optional<Integer>[][]) new Object[5][5];
有沒有辦法創建這樣的數組,如果是,那將是什么方法?
在Java中“ 創建泛型類型,參數化類型或類型參數的數組是非法的”。 “為什么創建泛型數組是非法的?因為它不是類型安全的。如果它是合法的,編譯器在正確的程序中生成的強制轉換可能在運行時因ClassCastException而失敗。這將違反由此提供的基本保證。泛型系統。 “ [Joshua Bloch - Effective Java]
那么什么解決方案能夠創建多維數組呢?
推薦的是使用容器:
List<List<Optional<Integer>>> arr = new ArrayList<>();
for (int i = 0; i < 5; i++) {
arr.add(new ArrayList<Optional<Integer>>());
}
除了泛型,你不能將Object[][]
轉換為raw-typed Optional[][]
。 您將在運行時獲得ClassCastException
。 必須將數組創建為Optional[][]
,而不是Object[][]
。 但是仿制葯通常是首選的原料類型。
並不是說你永遠不能創建泛型數組。 你必須間接地這樣做。 通常,這樣做的方法是創建無界通配符泛型的數組,然后執行未經檢查的強制轉換(正如您所做的那樣)到正確的類型:
@SuppressWarnings("unchecked")
Optional<Integer>[][] arr = (Optional<Integer>[][]) new Optional<?>[5][5];
以上內容適用於創建某些特定泛型類型的任何數組。 在這種情況下,您可以考慮使用OptionalInt
而不是Optional<Integer>
。 這繞過了對泛型數組的任何擔憂。
(總的來說,我有點懷疑創建陣列或任何風格的Optionals集合的概念。這似乎是一件奇怪的事情。通常有更好的選擇。但在某些情況下它可能是合理的。無論如何,無論是Optionals數組適用於您嘗試解決的任何問題,這是一個單獨的問題。)
由於類型安全,在Java中創建泛型數組是非法的。 請考慮使用列表。 鏈接到Oracle手冊: https : //docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.