簡體   English   中英

用Java將對象轉換為靜態嵌套類

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

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