为什么我无法初始化通用参数和数组?

时间:2013-11-15 15:38:25

标签: java generics

我正在尝试初始化 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];时,为什么会出现编译器错误?

2 个答案:

答案 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类。我不记得你是如何在语法方面做的,而是搜索数组的通用转换。