【问题标题】:Java Generics: Cannot create an array of a nested classJava 泛型:无法创建嵌套类的数组
【发布时间】:2015-01-11 15:55:00
【问题描述】:

我正在尝试将 AVLTree 实现转换为堆样式数组,但在使用泛型时遇到了一些问题:

public class MyAVLTree<K extends Comparable<? super K>, E> implements
    OrderedDictionary<K, E> {

    class AVLNode implements Locator<K, E>{
        // ...
    }

    // ....

    public Locator<K,E> [] toBSTArray() {
        AVLNode[] bArray = new AVLNode[size];
        makeArray(root, 0, bArray);  // recursion
        return bArray;
    }
}

AVLNode[] bArray = new AVLNode[size]; 行我收到以下错误:

“无法创建 MyAVLTree.AVLNode 的通用数组”

我看不出我做错了什么。有什么帮助吗?

【问题讨论】:

  • 这能解决吗:class AVLNode&lt;K, E&gt; implements Locator&lt;K, E&gt; ?
  • @vikingsteve 这应该是一个答案
  • @vikingsteve 你只是隐藏了类型变量。我非常怀疑这是想要的。
  • 感谢 vikingsteve,这是我的第一个想法,但正如 Radiodef 所说,它并没有真正解决问题。

标签: java arrays generics inner-classes


【解决方案1】:

这听起来很有趣,但你可以这样做:

AVLNode[] bArray = (AVLNode[]) Array.newInstance(AVLNode.class, size);

【讨论】:

  • 谢谢,这似乎是另一种解决方案。
  • 在编译时将 Array.newInstance() 与硬编码的类一起使用是没有意义的。
【解决方案2】:

内部类从外部类捕获类型变量,所以这就是您收到错误的原因。

如果您希望实例化原始AVLNode[],您可以将类名限定为原始MyAVLTree

//                     vvvvvvvvv
AVLNode[] bArray = new MyAVLTree.AVLNode[size];

您将像通常创建原始数组类型一样收到警告;但是这将编译。如果您不了解它们,请注意通常的事情that come along with raw types,尽管您当然不能在 Java 中实例化非原始数组。

【讨论】:

  • 谢谢,看来问题已解决。我可以发誓我试过了,但没有:)
  • 没问题,很乐意提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2017-11-01
  • 2020-08-05
  • 2011-07-22
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
相关资源
最近更新 更多