【问题标题】:Call Method of Generic Class within an Object[] ArrayObject[] 数组中泛型类的调用方法
【发布时间】:2017-11-05 19:08:23
【问题描述】:

我有一个通用类,名为Node<E>,我正在尝试定义一个静态方法,该方法将返回该类型的对象数组。我知道 Java 不允许在类中创建泛型类型数组,因此我们必须创建一个 Object 数组并通过对象传递我们的泛型类型。

以代码为例,我们定义为:

public static Object[] returnArray() {
    Object[] output;
    //code which adds Node<E> to output
    return output;

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

  • 对数组中的对象执行此类的方法,因为它们的类型为Object
    • 如果Node&lt;E&gt; 有一个方法.getVal(),则以下代码会导致错误:
      • Object[] nodes = Node.returnArray(head); nodes[0].getVal();
  • 将方法数组转换并返回到Node&lt;E&gt;[] 数组,即使是显式类型。
    • Node&lt;Integer&gt;[] nodes = (Node&lt;Integer&gt;[]) Node.returnArray(head);

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

Object[] nodes = Node.returnArray(head);
Node<Integer> returned1 = (Node<Integer>) nodes[0];
Node<Integer> returned2 = (Node<Integer>) nodes[1];

但是您可以看到随着代码的增长它变得多么冗余。有没有更好的方法来访问传递给数组的泛型对象?

【问题讨论】:

  • 您不能创建ENode&lt;E&gt; 的数组,但您当然可以创建Node 的数组。
  • 另外,您可能应该只创建一个列表。如果你可以只使用一个列表,那么尝试让泛​​型和数组一起工作是没有意义的。
  • 您可以创建Node 的数组并将其转换为Node&lt;E&gt;[],并为您的方法添加警告抑制。确保您现在可以确保它确实是E(在很多情况下这并不难)。

标签: java arrays generics


【解决方案1】:

可以创建通用数组。为此,您只需要 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[],因此使用起来很安全,甚至可以外化。 当然,另一种选择就是使用列表。

【讨论】:

  • 这里不相关。他们没有尝试创建类型变量类型的数组。这里数组的运行时组件类型在编译时已知的——它是Node
猜你喜欢
  • 2020-02-26
  • 2019-07-13
  • 1970-01-01
  • 2012-04-21
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多