Object []数组中泛型类的调用方法

时间:2017-11-05 19:08:24

标签: java arrays generics

我有一个名为Y的泛型类,我试图定义一个静态方法,它将返回这种类型的对象数组。我知道Java不允许在类中创建泛型类型数组,所以我们必须创建一个Object数组并通过该对象传递我们的泛型类型。

有关代码的示例,请将其定义为:

Node<E>

当我实现此代码时,我无法:

  • 对数组中的对象执行此类的方法,因为它们的类型为public static Object[] returnArray() { Object[] output; //code which adds Node<E> to output return output;
    • 如果Object有方法Node<E>,则以下代码会导致错误:
      • .getVal()
  • 将方法数组转换为Object[] nodes = Node.returnArray(head); nodes[0].getVal();数组,即使显式类型也是如此。
    • Node<E>[]

因此,我当前访问每个节点的方法的唯一方法是通过强制转换将它们分配给变量:

Node<Integer>[] nodes = (Node<Integer>[]) Node.returnArray(head);

但是随着代码的增长,你可以看到它有多余。有没有更好的方法来访问传递给数组的通用对象?

1 个答案:

答案 0 :(得分:0)

可以创建通用数组。你只需要Class对象。考虑这个过于复杂的打印数字6的程序:

public class GenericClass<T> {

    T[] array;

    public GenericClass(int length, Class<T> clazz) {
        array = (T[]) java.lang.reflect.Array.newInstance(clazz, length);
    }

    public T get(int i) {
        return array[i];
    }

    public T set(int i, T val) {
        return array[i] = val;
    }

    public static void main(String... args) {
        GenericClass<Integer> example = new GenericClass<>(5, Integer.class);
        example.set(0, 6);
        System.out.println(example.get(0)); //Prints 6
    }
}

这样,您创建的数组非常类型为T[],而不是Object[],因此可以安全使用甚至外部化。 当然,另一种选择就是使用清单。