初始化Java泛型数组的类型为泛型。

7

我正在开发一个通用的哈希表类,想要将其泛化以适应任意数量的输入类型,并且我还想初始化内部存储数组为LinkedList的数组(用于处理冲突),其中每个LinkedList都提前指定(用于类型安全),使其与哈希表类的泛型类型相同。我该如何实现这一点?以下代码最能澄清我的意图,但当然无法编译。

public class HashTable<K, V>
{
    private LinkedList<V>[] m_storage;

    public HashTable(int initialSize)
    {
        m_storage = new LinkedList<V>[initialSize];
    }
}

重复问题 https://dev59.com/cXRB5IYBdhLWcg3wvpmc - skaffman
2个回答

15

Java中的泛型不允许创建带有泛型类型的数组。您可以将数组强制转换为泛型类型,但这会生成未经检查的转换警告:

public class HashTable<K, V>
{
    private LinkedList<V>[] m_storage;

    public HashTable(int initialSize)
    {
        m_storage = (LinkedList<V>[]) new LinkedList[initialSize];
    }
}

这里有一个很好的解释,没有涉及到为什么不允许创建通用数组的技术细节。


你可以在赋值语句中添加 @SuppressWarnings({"unchecked"}) 来让编译器保持安静。 - Aaron Digulla
你链接的页面实际上与同一件事无关。Angelika Langer的Generics FAQ的这个章节解释得很清楚。 - Paul Bellora
如果您在此命令之前使用@SuppressWarnings({"unchecked"})来保持编译器的安静,您也可以只执行@SuppressWarnings({"unchecked"})m_storage = new LinkedList [initialSize];,这有点简单,技术上与@SuppressWarnings({"unchecked"})m_storage =(LinkedList <V> [])new LinkedList [initialSize];没有区别。但我必须承认:这两者都不是很好看 :-( - Daniel Alder
1
说明链接已经失效。 - Daniel Alder

0

此外,您可以使用注释逐个方法地抑制警告:

@SuppressWarnings("unchecked")
public HashTable(int initialSize) {
    ...
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接