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