【问题标题】:Initialising array of private objects in Java在Java中初始化私有对象数组
【发布时间】:2019-12-04 19:16:41
【问题描述】:

为了给您一些背景信息,我正在尝试使用 Java 从头构建一个 HashMap。

我在尝试实例化节点数组时遇到了一些问题(如下定义的私有类)。我只想先实例化数组(在构造函数中),然后再更新同一个数组(在尚未实现的方法中)。

请在下面找到复制错误和错误消息的代码。为什么this.array = (K[]) new Object[this.size]; 行有效而this.buckets = (Node[]) new Object[this.size]; 行无效?

这是否可以在 Java 中实现,还是我应该完全重新考虑逻辑?

public class MyHashMapTest<K, V> {

    private class Node {
        K key;
        V val;
        Node next;

        Node(K k, V v, Node n) {
            key = k;
            val = v;
            next = n;
        }
    }

    private static final double defaultLoadFactor = 0.75;
    private static final int defaultSize = 16;

    private Node[] buckets;
    private K[] array;

    private int size;
    private int items;
    private double loadFactor;

    public MyHashMapTest() {
        this(defaultSize, defaultLoadFactor);
    }

    public MyHashMapTest(int initialSize) {
        this(initialSize, defaultLoadFactor);
    }

    public MyHashMapTest(int initialSize, double loadFactor) {
        this.size = initialSize;
        this.loadFactor = loadFactor;
        this.items = 0;
        this.array = (K[]) new Object[this.size];
        this.buckets = (Node[]) new Object[this.size];
    }

    public static void main(String[] args) {
        MyHashMapTest<String, String> a = new MyHashMapTest<String, String>();
    }
}

【问题讨论】:

  • 这能回答你的问题吗? casting Object array to Integer array error
  • 感谢分享链接,其实我知道如何实例化一个整数数组。我正在尝试实例化一个节点数组(如上定义)。我已经编辑了我的帖子以更好地反映这一点。
  • this.buckets = new Node[this.size]; 有什么问题?
  • 问题是,您不能将基类型的数组转换为派生类型的数组。您需要单独转换每个元素。
  • 你必须使用反射(特别是Array.newInstance)以编程方式创建一个泛型数组。

标签: java arrays generics


【解决方案1】:

您的Node 类不是静态的,这意味着它绑定到您的外部类的实例。您可以通过两种方式解决这个问题。

  1. 使用java.lang.reflect.Array创建数组:

this.buckets = (Node[]) Array.newInstance(Node.class, this.size);

  1. 创建您的嵌套类static(并为其添加泛型):

private static class Node&lt;A, B&gt; {

然后您可以定义您需要的泛型类型的 buckets 数组:

private Node<K, V>[] buckets;

然后你可以“正常”实例化你的数组:

this.buckets = new Node[this.size];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多