【问题标题】:Generic queue using an array使用数组的通用队列
【发布时间】:2014-01-09 16:53:01
【问题描述】:

您好,我正在为即将到来的测试进行复习,但遇到了一个遇到问题的问题。

我必须修改此代码http://pastebin.com/ED2A7VWy 以提供队列的通用实现。问题是队列使用了一个数组,出于某种原因,泛型似乎不能很好地与数组一起使用。我试过了:

public class Queue<E>{
    private E[] eArray = new E[5];
...

}

但这似乎不起作用。

【问题讨论】:

标签: java arrays generics queue


【解决方案1】:

改为转换数组:

@SuppressWarnings("unchecked")
private E[] eArray = (E[])new Object[5];

您可以阅读here为什么不允许这样做。

【讨论】:

  • 感谢这很好,泛型的 Java 实现真的很奇怪。
  • 如果你这样做,你必须确保不要将eArray作为E[]类型返回到类的外部。
【解决方案2】:

您可以这样做 - 不抑制警告 - 不强制转换:

public class Objects {

    // Call without a second parameter to get an array of the specified type with the specified length.
    public static <T> T[] newArray(int length, T... empty) {
        return Arrays.copyOfRange(empty, 0, length);
    }
}

public class Test<T> {

    public void test() {
        // Only specify the length - Java creates an empty one for the varargs param.
        T[] demo = Objects.<T>newArray(5);
        System.out.println(Arrays.toString(demo));
    }

【讨论】:

  • 与问题的相关性如何?你也可以String[] strings = new String[5];
  • @newacct - 它是一种创建泛型数组的方法,无需强制转换或抑制警告。
  • 它不会创建一个泛型类型的数组。你误解了它的作用。 String[]main 中创建并传入,该方法只是创建另一个相同运行时类型的数组。
  • @newacct - 它可用于创建任何类型的数组 - 包括泛型类型 - 无需强制转换或抑制警告。对我来说有价值。
  • 它不创建泛型类型的数组。您仍然需要传递一个已经创建的正确运行时类型的数组才能创建它。它没有价值。在您的情况下,您必须明确指定 String 才能调用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多