创建/复制泛型类型的数组

时间:2011-12-18 22:55:21

标签: java arrays generics

我要解决有关仿制药的问题,这会给我带来痛苦的痛苦。

基本上它应该是基于数组的最大堆的实现,我必须遵循给定的条件。 从头开始的代码如下所示:

//Interface with methods such as insert(), remove(), etc
public interface IMaxHeap<T extends Comparable<T>> {
   ...
}

public class MaxHeap<T extends Comparable<T>> implements IMaxHeap<T>{
    T[] m_array;

    ...

    public MaxHeap(int size){
        //TODO:
        //m_array = new T[size];
    }
    public MaxHeap(T[] array){
        //TODO:
        //Deep copy of array into m_array
    }
}

两个构造函数的代码就是我所痴迷的。 我不应该修改方法的签名,所以我不能做这样的事情:

public MaxHeap(Class<T> clazz, int size){
    m_array = (T[]) Array.newInstance(clazz, size);
}

此外,做'不安全&#34;像这样的Object []数组的类型转换给了我一个运行时例外(InvocationTargetException)

public MaxHeap(Class<T> clazz, int size){
    m_array = (T[]) new Object[size];
}

我找到了制作数组副本的通用方法,但它并不是一个深层副本:

public MaxHeap(T[] array){
    m_array = Arrays.copyOf(array, array.length);
}

所以这一点m_array [0] == array [0]并不是我正在寻找的东西。

我也不应该在课堂上添加其他约束(所以也没有T exdends Cloneable)。鉴于这些问题,我实际上找不到实例化数组的方法。

我对泛型有点新鲜(我只使用过C ++模板)所以那些带有T的怪癖非常烦人。 你们能指点我一个有效的解决方案吗?

2 个答案:

答案 0 :(得分:2)

根据我的经验,标准的做法是使支持数组的类型为Object[],然后在读取其元素时强制转换为T类型。

一般来说,在Java中使用泛型类型数组非常危险且令人困惑。最好尽量避免使用它。

但是当你坚持以这种方式做事时,这似乎是解决方案:

    public MaxHeap(int size){
        m_array = (T[])new Comparable[size];
    }
    public MaxHeap(T[] array){
        this(array.length);
        System.arraycopy(array, 0, m_array, 0, array.length);
    }

答案 1 :(得分:-1)

即使使用Java泛型和类型擦除,作为您的类implements IMaxHeap<T>,您也可以在运行时使用反射获取T.class,此时一切都变得更加容易。以下应该有效:

  1. 调用Class.getGenericInterfaces()以获取您的类实现的接口,以及通用类型信息。第一个结果应该是代表IMaxHeap<T>的{​​{3}}实例。
  2. 将其投放到Type
  3. 就此致电ParameterizedType。您将获得代表Type的{​​{1}}。
  4. 将其投放到T
  5. 基本上,在Java中,您无法获取给定泛型类的实际类型参数,但可以获取其超类和接口的实际类型参数。问题是,对于那些情况,运行时需要知道那些实际类型,以便它可以进行适当的运行时检查/强制转换。