【问题标题】:Initialize Java Generic Array of Type Generic初始化泛型类型的 Java 泛型数组
【发布时间】:2009-06-22 07:11:54
【问题描述】:

所以我有这个我正在开发的通用 HashTable 类,我想将它通用地用于任意数量的传入类型,我还想将内部存储数组初始化为 LinkedList 的数组(用于冲突目的),其中每个 LinkedList 都被提前(为了类型安全)指定为 HashTable 类的泛型类型。我怎样才能做到这一点?下面的代码最能说明我的意图,但当然不能编译。

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

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

【问题讨论】:

标签: java generics hash


【解决方案1】:

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

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

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

Here 是一个很好的解释,无需深入了解为什么不允许创建泛型数组的技术细节。

【讨论】:

  • 您可以将@SuppressWarnings({"unchecked"}) 添加到分配中以保持编译器安静。
  • 您链接到的页面实际上不是一回事。 Angelika Langer 的泛型常见问题解答的This section 很好地解释了这一点。
  • 如果您在此命令之前使用@SuppressWarnings({"unchecked"}) 以保持编译器安静,您也可以只使用@SuppressWarnings({"unchecked"}) m_storage = new LinkedList[initialSize];,这更简单一点,技术上与@SuppressWarnings({"unchecked"}) m_storage = (LinkedList&lt;V&gt;[]) new LinkedList[initialSize]; 没有区别。但我必须同意:这些都不是很好:-(
  • 解释的链接坏了
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-04-05
    • 2010-10-02
    • 2019-03-16
    • 2019-10-06
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多