2011-11-17 47 views
1

我在Java中下面的代碼:泛型在Java中 - 實例牛逼

public static<T> void doIt(Class<T> t) 
{ 
    T[] arr; 
    arr = (T[])Array.newInstance(t, 4); 
} 

我希望能夠使用doIt方法同時使用基本類型,如雙和使用類String對象等。

我可以用做(代碼編譯):

doIt(double.class); 
    doIt(String.class); 

但是,我擔心的是,在第一種情況下,Java編譯器將實際使用Double類,包雙原始類型,我不想要。我實際上希望它在這種情況下實例化一個基本數組(同時用String情況實例化一個對象數組)。有人知道doIt(double.class)會發生什麼嗎?它是實例化爲Double還是Double?

謝謝。

+0

這將是雙。 – jn1kk

+0

在調試器中嘗試它並檢查數組的運行時類型。 –

+0

@skynorth:不,它是雙倍的。 – kloop

回答

4

你不能真正使T = double這裏 - Java泛型根本不與原始類型的工作。但是,您可以仍然實例化數組:

import java.lang.reflect.*; 

public class Test { 
    public static void main(String[] args) { 
     createArray(double.class); 
    } 

    private static void createArray(Class<?> clazz) { 
     Object array = Array.newInstance(clazz, 4); 
     System.out.println(array.getClass() == double[].class); // true 
    } 
} 

這真的取決於你希望以後與數組做什麼。

+0

謝謝。它確實返回true。我認爲這是雙重[]。 – kloop

+0

+1「你以後想要用數組做什麼」,這是關鍵問題。 'Array.newInstance'可以很好地創建原始數組;但不能以'T []'類型返回。我假設OP想要從函數返回其類型'T []',它會失敗 – newacct

0

仿製藥將與對象工作,所以它應該是一個雙拳擊後。

1

可以使原始double一個這樣的數組:

double[] arr = (double[]) Array.newInstance(double.class, 0); 

但你不能使這項工作與仿製藥,因爲一般的參數總是引用類型,而不是基本類型。

0

您可以創建一個帶有一個數組類型而不是元素類型的方法和周圍的問題類型參數必須是引用類型,因爲所有的數組類型是引用類型得到。

<T> T doIt(Class<T> arrayType) { 
    assert arrayType.getElementType() != null; 
    return <T> Array.newInstance(arrayType.getElementType(), 4); 
} 
+1

'double.class == Double.TYPE' – erickson

+0

@erickson,我根本不知道該語法的工作。謝謝。 –