[英]Java: Disclosing protected value from object static Class using casting
[英]Casting Object to static nested class in Java
考慮以下代碼:
public class OuterClass<T,P> {
private InnerClass<T,P>[] array; //field
public OuterClass() { //constructor
this.array = (InnerClass<T,P> [])new Object[30]; //problematic line
static class InnerClass<T,P> { //definition of my static nested class
...}
現在是這樣的主要方法:
OuterClass<String,Integer> oc = new OuterClass<>();
對於以下代碼,我得到一個ClassCastException。 問題出在OuterClass構造函數中。 從Object到我的靜態嵌套類的這種轉換會引發異常,我不明白為什么。 我將如何創建一個靜態嵌套類對象的數組(傳遞與OuterClass相同的泛型類型)?
您應該使用Array.newInstance
創建通用數組
@SuppressWarnings("unchecked")
public OuterClass() { //constructor
this.array = (InnerClass<T,P>[]) Array.newInstance(InnerClass.class, 30);
}
例:
import java.lang.reflect.Array;
public class OuterClass<T,P> {
public InnerClass<T, P>[] array; //field
@SuppressWarnings("unchecked")
public OuterClass() { //constructor
this.array = (InnerClass<T,P>[]) Array.newInstance(InnerClass.class, 30);
}
static class InnerClass<T, P> { //definition of my static nested class
}
public static void main(String[] args) {
OuterClass<Integer, Integer> outerClass = new OuterClass<>();
InnerClass<Integer, Integer> innerClass = new InnerClass<>();
outerClass.array[1] = innerClass;
System.out.println(outerClass.array[1]);
}
}
您是否嘗試過
this.array = new InnerClass[30]
?
這不起作用,因為我正在使用泛型。 Java不允許創建通用數組。
確實創建了這樣的通用數組:
this.array = new InnerClass<T, P>[30];
將是非法的,Eclipse給出錯誤: Cannot create a generic array of OuterClass.InnerClass<T,P>
或者,如果InnerClass
是泛型類型變量,則不能使用它創建數組:
public <InnerClass> OuterClass() {
this.array = new InnerClass[30];
}
您得到: Cannot create a generic array of InnerClass
但是,創建具體類型InnerClass
的原始數組(然后將其轉換為InnerClass<T, P>[]
)完全可以:
public OuterClass() {
this.array = new InnerClass[30];
}
您確實得到了unchecked
警告,但是可以忽略它,因為您沒有對周圍的陣列保持原始引用,因此不會(立即)發生堆污染的機會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.