2013-11-15 88 views
1

我想初始化Generic ParameterArray爲什麼我無法初始化通用參數和數組?

import java.util.ArrayList; 
import java.util.List; 

public class GenericExample<T> { 

/* 
* Complier error --> 
* 
* Cannot instantiate the type T 
*/ 
private T t = new T(); 

/* 
* Complier error --> 
* 
* Cannot create a generic array of T 
*/ 
private T[] tArray = new T[10]; 

/* 
* No Complier error. 
*/ 
private List<T> list = new ArrayList<T>(); 

} 

沒有錯誤時,泛型類型,初始化列表如下:

 /* 
* No Complier error. 
*/ 
private List<T> list = new ArrayList<T>(); 

然而,編者錯誤在我使用以下初始化時出現。

/* 
* Complier error --> 
* 
* Cannot instantiate the type T 
*/ 
private T t = new T(); 

     /* 
* Complier error --> 
* 
* Cannot create a generic array of T 
*/ 
private T[] tArray = new T[10]; 

有人可以幫助我走出了以下2個問題:

Q1:爲什麼List<T> list = new ArrayList<T>();沒有遇到編者錯誤?

Q2:爲什麼在使用private T t = new T();private T[] tArray = new T[10];時出現編譯器錯誤?

回答

2

這是由於type erasure。 JVM不知道在運行期間什麼是T,因爲通用信息在運行時不被保留以供使用(Java沒有具體化的泛型)。所以當你有T t = new T();private T[] tArray = new T[10];時,JVM不知道T是什麼。

List<T> list = new ArrayList<T>(); 

這工作,因爲你實際上最終編譯後如下:

List list = new ArrayList(); 

顯式轉換爲相應的類型檢索時再使用。也就是說,如果您有:

List<String> list = new ArrayList<String>(); 
list.add("hello"); 
String hello = list.get(0); 

在運行什麼JVM實際上看到的是:

List list = new ArrayList(); 
list.add("hello"); 
String hello = (String) list.get(0); 
0

在Java中,你無法初始化通用對象,如果通用必須存儲在內存中(如在你的第一個案例和一個對象的案例)。

對此有一些解決方法,您可以將您的泛型轉換爲Object類。我不記得在語法方面你是如何做到的,而是尋找數組的通用轉換。

相關問題