Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从使用泛型的类中创建数组_Java_Arrays_Generics_Creation - Fatal编程技术网

Java 从使用泛型的类中创建数组

Java 从使用泛型的类中创建数组,java,arrays,generics,creation,Java,Arrays,Generics,Creation,这是我在那个网站上的第一个问题! 我已经做了研究,但没有什么真正有效的 因此,问题在于,它与Java通用数组的创建有关: class HashArray<K,V>{ class HashNode<K,V>{ ... } HashNode[] array; HashArray(int size){ ArrayList<HashNode> arrayM = new ArrayList<HashNode>(size); array = a

这是我在那个网站上的第一个问题! 我已经做了研究,但没有什么真正有效的

因此,问题在于,它与Java通用数组的创建有关:

class HashArray<K,V>{

  class HashNode<K,V>{
...
}


HashNode[] array;

HashArray(int size){

ArrayList<HashNode> arrayM = new ArrayList<HashNode>(size);

array = arrayM.toArray(array);                         // pinned Line

}

}
我得到一个
泛型数组创建错误

我需要一个HashNodes之外的数组,因为我只允许使用数组创建项目


提前谢谢你

这里有几个问题。首先,内部类(
HashNode
)具有对其声明类(
HashArray
)实例的隐式引用。因此,它在其声明类的类型参数的范围内。您不应该为
HashNode
重新声明类型参数
K
V
,因为这样会隐藏外部参数:

class HashArray<K, V> {

    class HashNode {
        //K and V still have meaning in here
    }

    ...
}
进入数组创建:无法创建具体参数化类型的数组。请参阅Angelika Langer的泛型教程以了解详细信息。简而言之,泛型和数组就像油和水一样,您应该只使用集合

最好的解决方案是只使用
列表
。无论如何,您已经从一个开始:

List<HashNode> nodeList = new ArrayList<HashNode>(size);
注意,在Java7中,RHS在这两种情况下都可以是
newArrayList(size)


仅就我的答案的完整性而言,如果您确实坚持保留阵列,则需要使用未经检查的强制转换:

@SuppressWarnings("unchecked")
HashNode[] array = (HashNode[])new HashArray<?, ?>.HashNode[size];

但是这本身就是不安全的,不应该这样做

HashNode[]数组未初始化。将
数组
作为参数传递到固定线中。如果将
null
传递给
toArray()
它将抛出NPE。有没有方法初始化它?假设无法创建对象?
HashNode[]数组=新的HashNode[0]
它还返回“generic array creation”错误:CacheStr.java:110:error:generic array creation HashNode array=new HashNode[0]^第一个“HashNode”还有[]个存储库供您完整响应!非常感谢!问题是我只需要使用数组。我可以创建一个二叉树或避免它们的东西,但经过研究,我发现使这个项目整洁的最好方法是散列数组。因此,我需要只使用数组实现通用哈希(所有对象都有hashCode())。这就是交易。我同意,使用收藏本来是小菜一碟,但我是不被允许的。在编辑之后,你使它变得完美了@用户2007447好的,但我不能夸大这不是一个安全的解决方案。我鼓励您阅读链接文章,了解原因。因为这听起来像是一项作业,我将让你来澄清如何处理你的教授。请随意询问她/他,甚至指向这篇文章。“不应该这样做”我不同意这一点。不允许创建参数化类型的数组的原因非常模糊,在正常情况下99%的时间里都不相关。@newacct无论这是否正确,在正常情况下99%的时间里都没有理由不使用泛型集合。
List<HashNode> nodeList = new ArrayList<HashNode>(size);
List<HashNode<K, V>> nodeList = new ArrayList<HashNode<K, V>>(size);
@SuppressWarnings("unchecked")
HashNode[] array = (HashNode[])new HashArray<?, ?>.HashNode[size];
@SuppressWarnings("unchecked")
HashNode<K, V>[] array = (HashNode<K, V>[])new HashNode<?, ?>[size];