Q: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数组类型并非为任何数据类型的父类型。

回到目录|·(工)·)

posted @ 2018-01-09 21:43  林学徒  阅读(...)  评论(...编辑  收藏