1

我真的很困惑。我的代码:

public void testList(){
    int cnt = 3;
    LinkedList<LvRow>[] vListItems = new LinkedList[cnt]; //eclipse suggest warnning
    for (int i = 0; i < cnt; i++) {
        vListItems[i] = new LinkedList<LvRow>();
    }
}

eclipse 提出警告:

类型安全:The expression of type LinkedList[] needs unchecked conversion to conform to LinkedList<LvRow>[]

这似乎是一个演员问题。我试过很多次,但我不知道如何施法。任何人都可以帮助我吗?

顺便说一句,如果以下代码相同,或者有什么不同?

 LinkedList<LvRow>[] vListItems = new LinkedList[cnt];
 LinkedList<LvRow> vListItems[] = new LinkedList[cnt];
4

3 回答 3

7

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

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

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

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

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

如果您使用通用列表尝试相同的操作,则会出现问题:

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.

这一切都是因为类型擦除而发生的。

解决方案

您应该List为此使用集合,以便编译器可以进行静态类型检查并为您提供类型安全。

List<LinkedList<LvRow>> list = new ArrayList<LinkedList<LvRow>>();
于 2013-11-12T10:13:28.080 回答
1

使用泛型时,您不能创建具有泛型类型的对象数组。这是因为数组执行数组存储检查,以确保数组中的对象属于组件类型。由于类型擦除删除了类型参数,因此在运行时无法知道数组的确切类型。 阅读更多

您可以通过创建一个List<List<LvRow>>.

List<List<LvRow>>[] vListItems = new LinkedList<List<LvRow>>(); 
于 2013-11-12T10:10:20.130 回答
-1

你可以这样使用:

LinkedList<LvRow>[] vListItems = new LinkedList<LvRow>[cnt];
于 2013-11-12T10:11:32.357 回答