2011-12-11 60 views
3

我有一個類,我需要構造函數來初始化變量數組。我研究了互聯網和堆棧溢出,但現在我停留在如何調用該方法。例如,我怎麼能在我的例子中調用method1?如何調用需要類<T>對象作爲參數的方法?

public class SomeClass<T>{ 

    public T[] array; 

    //Constructor 
    public SomeClass() 
    { 
     Method1(T, 5); //? error 
     Method1(5); //? error 
     Method1(new T().GetType(), 5); //? error 
     // HOW CAN I CALL THAT METHOD? 

     array = (T[])(new Object[5]); // this gives an error too 
    } 

    private void Method1(Class<T> type, int size) 
    { 
     array = (T[])Array.newInstance(type, size); 
    } 
} 
+0

爲什麼'array'是'public'的任何理由? –

+0

檢查了這一點。這基本上是相同的問題: http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation – eboix

回答

5

試試這個:

class SomeClass<T> { 

    private T[] array; 

    @SuppressWarnings("unchecked") 
    public SomeClass(Class<T> klass, int size) { 
     array = (T[]) Array.newInstance(klass, size); 
    } 

} 

並初始化它:

SomeClass<Integer> example = new SomeClass<Integer>(Integer.class, 10); 

注意,實例化的數組是一個對象數組,它的所有元素將是null直到你明確指定它們。

+0

+1良好的完整答案。 –

-1

您的方法是非靜態的,因此您必須在調用任何方法之前實例化對象。你不能在構造函數中調用非靜態方法。如果Method1的輸出僅依賴於輸入而不依賴於對象的當前狀態,請將static添加到其類型聲明(private static void Method1...)中,此修復將允許您的構造函數中的第一個調用運行。

+1

不能調用構造函數中的非靜態方法?你確定? –

+3

你當然可以在構造函數中調用非靜態方法。試試看看。 –

+0

你知道java嗎?我認爲你所知道的唯一的java就是咖啡的俚語......你可以在構造函數中調用非靜態方法,唯一需要一個靜態方法或變量的地方是你正在以另一個靜態方法訪問它,或者出於該類,而不使用該類的新實例。唯一一次你真的有一個靜態方法的目的是它需要使用基類Class.method()而不是instance.method()來訪問它。看到構造函數一開始,您就可以控制類的新實例,您可以訪問任何非靜態方法/變量 –

3

您將需要代表TClass對象傳遞到SomeClass構造:

public SomeClass(Class<T> clazz) 
{ 
    array = Method1(clazz, 5); 
} 

這是必要的,因爲Type Erasure,這意味着T將在運行時沒有任何意義(Array.newInstance需要代表一個Class對象數組的元素類型出於同樣的原因)。

相關問題