我正在尝试初始化 Generic Parameter
和 Array
像
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>();
}
使用Generic类型初始化列表时没有错误,如下所示:
/*
* No Complier error.
*/
private List<T> list = new ArrayList<T>();
但是,当我使用以下初始化时,会出现Complier错误。
/*
* 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];
有人可以通过以下两个问题帮助我:
Q1:为什么List<T> list = new ArrayList<T>();
没有遇到编译器错误?
Q2:使用private T t = new T();
和private T[] tArray = new T[10];
时,为什么会出现编译器错误?
答案 0 :(得分: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);
答案 1 :(得分:0)
在Java中,如果通用必须存储在内存中,则无法初始化通用对象(如第一种情况和对象的情况)。
有这方面的解决方法,您可以将您的泛型转换为Object类。我不记得你是如何在语法方面做的,而是搜索数组的通用转换。