Q:java中的泛型数组

JAVA学习网 2018-01-10 16:31:02

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

回到目录|·(工)·)

阅读(799) 评论(0)