簡體   English   中英

為什么在外部參數化類中以組件類型為內部類創建數組被視為“通用數組創建”?

[英]Why is creating an array in a outer parameterized class with a component type being an inner class considered “Generic array creation”?

public class A<T> {
    B[] bs = new B[5];

    private class B {

    }
}

我收到一個編譯時錯誤,說new B[5]是通用數組創建。 我沒想到這是因為:

  1. B本身未參數化。
  2. B不是A的類型參數。

考慮到這些原因,為什么仍將new B[5]視為通用數組創建?

因為創建B實例的唯一方法(因為它是內部類)是使用參數化A的實例。 簡單修復,更改

private class B

private static class B

由於B是一個非靜態內部類的A ,的范圍內A ,非限定名稱B意味着A<T>.B ,並且這是一個參數化的類型(盡管B看起來不參數化)。 (這很有意義,因為非靜態內部類包含對外部類實例的引用;由於對該外部類實例的引用是參數化的,因此內部類實例也必須進行參數化,因此內部類實例“繼承”外部類類型參數。)您無法在數組創建表達式中創建參數化類型的數組,因此無法進行new B[5] (因為它隱式意味着new A<T>.B[5] )。

您可以改為創建原始類型的數組。 但是請記住, B本身是參數化類型,而不是原始類型。 要獲取原始類型,必須使用原始外部類類型顯式限定它:

B[] bs = new A.B[5];

或者,您可以創建一個通配符參數化類型的數組:

B[] bs = (B[])new A<?>.B[5];

在這兩種情況下,您都會得到未經檢查的警告,如果您想獲取類型為“參數化類型的數組”的變量,例如B[] ,那么在Java中這是不可避免的警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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