簡體   English   中英

創建 Optionals 的多維通用數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM