2013-01-24 67 views
1

它是我在该站点上的第一个问题! 我已经做了我的研究,但没有真正的作品...使用泛型的类创建阵列

所以,现在的问题是,它与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 

} 

} 

,并有一个NullPointerException在固定线。 如果我尝试类似:

array = new HashNode[size]; 

我得到了Generics Array Creation error。我需要一个数组哈希节点,因为我只允许与数组。

预先感谢您!

+0

'HashNode [] array;'未初始化。您将'array'作为固定行中的参数。如果你将'null'传递给'toArray()',它会抛出NPE。 – jlordo

+0

有没有办法初始化它?鉴于你不能创建对象? – user2007447

+0

'HashNode []数组=新HashNode [0];' – jlordo

回答

3

这里有几个问题。首先,内部类(HashNode)对其声明类的实例(HashArray)具有隐式引用。因此,它处于其声明类的类型参数的范围内。你不应该重新声明的类型参数KVHashNode,因为这是隐藏在外层标记:

class HashArray<K, V> { 

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

    ... 
} 

要么,让HashNode一个静态嵌套类来简化事情自己:

class HashArray<K, V> { 

    static class HashNode<K, V> { 
     //no implicit reference to an outer HashArray 
    } 

    ... 
} 

进入数组创建:无法创建具体参数化类型的数组。请参阅Angelika Langer的泛型教程explanation on why。简而言之,仿制药和阵列就像油和水,你应该只使用收集品。

最好的解决办法就是改用List<HashNode>。你已经开始用一个反正:

List<HashNode> nodeList = new ArrayList<HashNode>(size); 

或者,如果你让HashNode静态类:

List<HashNode<K, V>> nodeList = new ArrayList<HashNode<K, V>>(size); 

注意,在Java 7中,在RHS可以只是在这两种情况下new ArrayList<>(size)


我的回答的完整性而已,如果你真的坚持要保持数组,你需要使用一个未经检查的转换:

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

或者,如果HashNode作出静态:

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

但是,这将是固有的不安全和不应该完成

+0

感谢您的全面回复!非常感谢!问题是我只需要使用数组。我可以制作一个二叉树或避免它们的东西,但经过研究后,我发现使这个项目整齐的最佳方式是一个哈希阵列。所以我需要实现泛型哈希(所有的对象都有hashCode())只有数组。这是交易。使用集合本来就是小菜一碟,我同意,但我不被允许。 – user2007447

+0

编辑完成后,您完成了! – user2007447

+0

@ user2007447好吧,但我不能夸大,这不是一个安全的解决方案。我鼓励你阅读链接的文章来理解为什么。由于这听起来像是一项任务,我会留给你澄清如何处理你的教授。随意问她/他甚至指向这个职位。 –