對於java,其是不支持直接創建泛型數組的。當採用如下的方式去創建一個泛型數組時,其會出現錯誤,編譯無法通過的情況。 但是,在java中,其卻可以創建泛型類型的數組變數,如下所示的代碼,其並不會出現錯誤的情況。 一個問題是,我們想要創建一個泛型類型的數組變數,那麼應當怎麼辦? ...
對於java,其是不支持直接創建泛型數組的。當採用如下的方式去創建一個泛型數組時,其會出現錯誤,編譯無法通過的情況。
package other.jdk1_5;
/**
* 該類用於演示泛型數組的創建
* @author 學徒
*
*/
public class Generics<T>
{
T[] a=new T[];
}
報錯的信息:
Multiple markers at this line
- Cannot create a generic array of T
- Variable must provide either dimension expressions or an array
但是,在java中,其卻可以創建泛型類型的數組變數,如下所示的代碼,其並不會出現錯誤的情況。
package other.jdk1_5;
/**
* 該類用於演示泛型數組的創建
* @author 學徒
*
*/
public class Generics<T>
{
T[] a;
}
一個問題是,我們想要創建一個泛型類型的數組變數,那麼應當怎麼辦?這裡,可以通過反射的方式來進行解決。
示例代碼如下:
package other.jdk1_5;
import java.lang.reflect.Array;
/**
* 該類用於演示泛型數組的創建
* @author 學徒
*
*/
public class Generics
{
/**
* 用於創建一個數據類型為T的泛型數組
* @param clazz 泛型類型的Class類
* @param length 數組的長度
* @return 泛型數組
*/
@SuppressWarnings("unchecked")
public static <T> T[] newArrayByArrayClass(Class<T[]> clazz,int length)
{
//class對象的getComponentType方法返回的是該class類對象所對應的元素類型
return (T[]) Array.newInstance(clazz.getComponentType(), length);
}
public static <T> T[] newArrayByClass(Class<T> clazz,int length)
{
return (T[])Array.newInstance(clazz, length);
}
public static void main(String[] args)
{
//通過泛型類型數組的class對象創建數組
String[] a=newArrayByArrayClass(String[].class,10);
//通過泛型類型的class對象創建數組
String[] b=newArrayByClass(String.class,10);
}
}
在《演算法》第四版一書的第一章中,其在提到關於泛型的那部分內容時,有說到可用通過如下的代碼的方式創建泛型數組
T[] a=(T[])new Object[cap];
顯然,這段代碼在編譯器的檢查中,會給出一條警告信息,雖然可以忽略它。但是,通過該方式生成的代碼,在運行期間仍然會出現類型強轉錯誤,因為對於該方式創建的泛型數組而言,其並非為運用了向下轉型技術,因Object數組類型並非為任何數據類型的父類型。