【问题标题】:how to create an array of custom class that contains generics in Java如何在 Java 中创建包含泛型的自定义类数组
【发布时间】:2020-02-18 03:58:26
【问题描述】:

我有一个任务,目标是创建一个具有通用键和值的 HashTable 实现。为了处理冲突,我们被告知要使用单独的链接。所以,我尝试这样做:

public class HashTable<K, V> implements Table<K, V> {

    private Node[] generics;

    public class Node {

        V value;
        Node next;

        public Node(V val) {
            value = val;
        }

    }

    public HashTable(int size) {
        generics = (Node[]) new Object[size];
    }

}

对于单独的链接,我想使用链表实现(还有什么),这就是为什么我需要generics 来保存Node,而不仅仅是V。我不能只写generics = new Node[size]; 的原因是 Node 类包含一个泛型,并且不允许创建泛型数组。对于这个分配,这个产生“未经检查的强制转换”警告的解决方法是可以接受的。

然后,在驱动程序中,它尝试Table&lt;String, String&gt; ht = new HashTable&lt;String, String&gt;(5); 并获得 ClassCastException。当genericsV[] 时,没有ClassCastException,用于上下文。

所以,我的问题是:如何创建自定义类数组,其中自定义类包含泛型(不更改驱动程序)?

【问题讨论】:

  • 只需将generics 设为Object 数组,然后在您的get 方法中将各个值转换为Node。但是您知道Node 的数组不是链表,对吧?它仍然是一个数组。
  • @MattD 是的,它是Node 的数组。每一个都是链表的头部。
  • @MattD 我尝试了您的建议,并且有效。但是,它会在尝试从Object 转换为Node 时创建一个“未经检查的转换”警告,并且我们被允许的唯一编译警告来自泛型数组创建(尽管Node 本身不是泛型的)。感谢你的回答!这个解决方案似乎仍然是不好的做法,但它确实有效,并且某种未经检查的强制转换似乎是不可避免的。

标签: java arrays generics classcastexception


【解决方案1】:

试试下面的解决方案

public class HashTable<K, V> {
    private Node<V>[] generics;

    static class Node<V> {
        V value;
        Node next;
        public Node(V val) {
            value = val;
        }
    }
    private HashTable(int size) {
        generics = (Node<V>[]) new Node[size];
    }
}

generics = (Node[]) new Node[size];此行将为您提供此代码的未经检查的强制转换警告 impl check HashMap source code

如果你想删除未经检查的强制转换警告而不是泛型类型引用中的通配符

 public class HashTable<K, V> {
    private Node<?>[] generics;

    static class Node<V> {
        V value;
        Node next;
        public Node(V val) {
            value = val;
        }
    }
    public HashTable(int size) {
        generics = new Node<?>[size];
    }
 }

它不会给你任何“未经检查的演员表”警告。为此你可以HashTable源代码

【讨论】:

  • 非常感谢您提供此解决方案。只是一个后续:你能解释为什么Node&lt;V&gt; 类必须是静态的吗?如果没有 static 关键字,编译器会说“错误:创建泛型数组”。
  • 我不确定,但我认为没有静态 new Node&lt;?&gt;[size] 会给你错误。原因是没有静态你可以直接引用嵌套类new Node&lt;?&gt;
  • 如果您不想使用静态而不是使用,您可以创建嵌套类 obj,例如 new HashTable.Node[size]。更多详情请参考stackoverflow.com/q/70324/6582610
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 2020-12-11
  • 2014-02-23
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
相关资源
最近更新 更多