[英]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]
是通用數組創建。 我沒想到這是因為:
考慮到這些原因,為什么仍將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.