2013-08-07 48 views
4

我在構造函數中提供了具有Class<T>對象的泛型類型。我想在這個構造函數中創建二維數組T[][],但是這有可能嗎?使用Class對象創建通用二維數組

+0

不適用於Java,僅適用於運行時泛型類似C#的語言。考慮刪除。 –

+0

請發佈您正在考慮使用的構造函數的特定簽名。這可能是可能的,但不清楚你在問什麼。 – chrylis

+1

是的,你可以使用Array.newInstance()。請參閱http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation。我會重複舉牌,但我沒有參加比賽,有人可以照顧這件事嗎? –

回答

14

How to create a generic array in Java?而是擴大到2D:閱讀上述JAB的評論後

import java.lang.reflect.Array; 

public class Example <T> { 

    private final Class<? extends T> cls; 

    public Example (Class<? extends T> cls) { 
     this.cls = cls; 
    } 

    public void arrayExample() { 
     // a [10][20] array 
     @SuppressWarnings("unchecked") 
     T[][] array = (T[][])Array.newInstance(cls, 10, 20); 
     System.out.println(array.length + " " + array[0].length + " " + array.getClass()); 
    } 

    public static final void main (String[] args) { 
     new Example<Integer>(Integer.class).arrayExample(); 
    } 

} 

注意:要擴展到更多的維度,只需添加[]的和尺寸參數的newInstance()(CLS是一類,D1〜D5爲整數):

T[] array = (T[])Array.newInstance(cls, d1); 
T[][] array = (T[][])Array.newInstance(cls, d1, d2); 
T[][][] array = (T[][][])Array.newInstance(cls, d1, d2, d3); 
T[][][][] array = (T[][][][])Array.newInstance(cls, d1, d2, d3, d4); 
T[][][][][] array = (T[][][][][])Array.newInstance(cls, d1, d2, d3, d4, d5); 

詳見Array.newInstance()

+0

我注意到OP編輯了這個問題並添加了「在這個構造函數中」。與上述方法相同(例如,將arrayExample()中的代碼移入構造函數中)。 –

+0

謝謝,我不知道(我認爲我檢查了文檔),我可以使用newInstance更多的參數 - 我的錯,我可以檢查出來。 –

+1

投射到T [] []'(或其他)是不安全的。 'cls'可能是一個原始類型。 – newacct