如何在 Java 中正确定义链表数组? [英] How to properly define an array of linked list in Java ?

查看:20
本文介绍了如何在 Java 中正确定义链表数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试在 Java 中定义一个链表数组,如下所示,编译正常,但生成了 2 条警告消息.

I tried to define an array of linked list in Java like the following, which compiled fine but it generated 2 warning messages.

 LinkedList<Long> [] hashtable = new LinkedList[10];

warning: [rawtypes] found raw type: LinkedList
    LinkedList<Long> [] hashtable = new LinkedList[10];
                                        ^
  missing type arguments for generic class LinkedList<E>
  where E is a type-variable:
    E extends Object declared in class LinkedList
HashTable.java:13: warning: [unchecked] unchecked conversion
    LinkedList<Long> [] hashtable = new LinkedList[10];
                                    ^
  required: LinkedList<Long>[]
  found:    LinkedList[]

所以,我试过了

 LinkedList<Long> [] hashtable = new LinkedList<Long>[10];

但这一次它甚至不会编译并生成此错误.

But this time it would not even compile and generate this error instead.

HashTable.java:13: error: generic array creation
    LinkedList<Long> [] hashtable = new LinkedList<Long>[10];
                                    ^
1 error

那么,我应该如何正确定义我的链表数组?

So, how should I define my array of linked list properly ?

推荐答案

这是创建数组的正确方法:

This is a proper way to create an array:

@SuppressWarnings("unchecked") LinkedList<Long> [] hashtable = new LinkedList[10];

无法创建参数化类型的数组

您不能创建参数化类型的数组.例如,以下代码无法编译:

Cannot Create Arrays of Parameterized Types

You cannot create arrays of parameterized types. For example, the following code does not compile:

List<Integer>[] arrayOfLists = new List<Integer>[2];  // compile-time error

以下代码说明了将不同类型插入数组时会发生什么:

The following code illustrates what happens when different types are inserted into an array:

Object[] strings = new String[2];
strings[0] = "hi";   // OK
strings[1] = 100;    // An ArrayStoreException is thrown.

如果你用通用列表尝试同样的事情,就会出现问题:

If you try the same thing with a generic list, there would be a problem:

Object[] stringLists = new List<String>[];  // compiler error, but pretend it's allowed
stringLists[0] = new ArrayList<String>();   // OK
stringLists[1] = new ArrayList<Integer>();  // An ArrayStoreException should be thrown,
                                            // but the runtime can't detect it.

如果允许参数化列表的数组,则前面的代码将无法抛出所需的ArrayStoreException.

If arrays of parameterized lists were allowed, the previous code would fail to throw the desired ArrayStoreException.

取自 docs.oracle.com

这是否意味着我现在可以在hashtable[0] 和一个 Long in hashtable 的链表1,如果我这样做LinkedList [] hashtable = new LinkedList[10]?

Does it mean I am now allowed to have a linked list of string in the hashtable[0] and a linked list of Long in hashtable1, if I do LinkedList [] hashtable = new LinkedList[10]?

不,编译器不允许您直接将 LinkedList 存储到哈希表数组.以下代码段无法编译:

No, compiler won't allow you to store LinkedList to the hashtable array directly. Following snippet won't compile:

hashtable[0] = new LinkedList<String>();

然而,你可以不带类型参数存储 LinkedList,甚至可以存储 LinkedList 的子类:

However you can store the LinkedList without type parameters, or even a subclass of LinkedList:

@SuppressWarnings("unchecked") LinkedList<Long>[] hashtable = new LinkedList[10];

hashtable[0] = new LinkedList<Long>();
hashtable[1] = new MyLinkedList<Long>();
hashtable[2] = new LinkedList();
hashtable[3] = new MyLinkedList();

如果将数组转换为 LinkedList[],则可以存储 LinkedList.但是,除了 LinkedList 之外,您将无法存储其他任何内容:

You can store the LinkedList if you cast your array to LinkedList[]. However you won't be able to store the anything else but a LinkedList:

LinkedList[] rawHashTable = hashtable;
rawHashTable[4] = new LinkedList<String>();

Object[] objectHashTable = rawHashTable;
objectHashTable[5] = "This line will throw an ArrayStoreException ";

这篇关于如何在 Java 中正确定义链表数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆