【发布时间】: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<E>有一个方法.getVal(),则以下代码会导致错误:Object[] nodes = Node.returnArray(head); nodes[0].getVal();
- 如果
- 将方法数组转换并返回到
Node<E>[]数组,即使是显式类型。Node<Integer>[] nodes = (Node<Integer>[]) Node.returnArray(head);
所以我目前访问每个节点的方法的唯一方法是通过强制转换将它们分配给一个变量:
Object[] nodes = Node.returnArray(head);
Node<Integer> returned1 = (Node<Integer>) nodes[0];
Node<Integer> returned2 = (Node<Integer>) nodes[1];
但是您可以看到随着代码的增长它变得多么冗余。有没有更好的方法来访问传递给数组的泛型对象?
【问题讨论】:
-
您不能创建
E或Node<E>的数组,但您当然可以创建Node的数组。 -
另外,您可能应该只创建一个列表。如果你可以只使用一个列表,那么尝试让泛型和数组一起工作是没有意义的。
-
您可以创建
Node的数组并将其转换为Node<E>[],并为您的方法添加警告抑制。确保您现在可以确保它确实是E(在很多情况下这并不难)。