【问题标题】:2D Arrays and Generics Issue (Java)二维数组和泛型问题 (Java)
【发布时间】:2012-01-06 13:00:31
【问题描述】:

我在理解一些关于 2D 数组(包含 ArrayList 的 ArrayList)和泛型的编译器错误时遇到问题。我对泛型的理解不是最好的,所以我试图事先研究这个问题,结果还是一头雾水。

根据2D dynamic array using ArrayList in Java 上的 cmets,您不能将数组与泛型混合使用(或者更确切地说,您可以使用 @SuppressWarnings("unchecked"),但不鼓励这样做)。但是,我不确定这到底是什么意思。

这是我的问题代码:

    blocks = new ArrayList<ArrayList<BarrierBlock>>(columns); // initialize rows
    for (int i = 0; i < columns; i++){
        // blocks.get(i) = new ArrayList<BarrierBlock>(rows);  <- ERROR = (unexpected type; required: variable, found: value)
        blocks.add(new ArrayList<BarrierBlock>(rows)); // initialize columns
    }

    // initilize each block
    for (int i = 0; i < blocks.size(); i++){
        for (int j = 0; i < blocks.get(i).size(); j++){
            int[] blockLoc = {location[0] + (i*BLOCK_SIDE_LENGTH), location[1] + (j*BLOCK_SIDE_LENGTH)};
            // blocks.get(i).get(j) = new BarrierBlock(BLOCK_SIDE_LENGTH, blockLoc); <- ERROR = (unexpected type; required: variable, found: value)
            blocks.get(i).add( new BarrierBlock(BLOCK_SIDE_LENGTH, blockLoc)); // initialize 2D array elements
        }
    }

我注释掉的两行是我初始化数组的最初尝试。当我尝试这个时编译器抱怨并给了我列出的错误。这个错误是什么意思?我会认为声明语句的双方都是变量。

看了一圈,发现我应该使用ArrayList的add(E e)方法。但主要区别是什么?在我初始化数组的新方式中,那不是也“将数组与泛型混合”吗?

【问题讨论】:

    标签: java generics multidimensional-array arraylist


    【解决方案1】:

    Get RETURNS 给定索引处的对象,它不能用于设置对象。

    您可以使用 get 执行以下操作:

    list l = new list();
    item a;
    l.add(a);
    item b = l.get(0);
    b.property = 10;
    l.get(0).property == 10; //true, a is the same object as b
    b = new item();
    l.get(0) == b; //false, list[0] is still a, b is now pointing to a different object
    l.get(0) = b; //error, you can't assign to list.get
    

    【讨论】:

    • @Jean-Bernad Pellerin 啊,我明白了。所以我的问题毕竟与泛型没有任何关系,我只是没有正确使用 API。使用嵌套的 ArrayLists 时甚至可能遇到与泛型相关的问题吗?
    • 在使用泛型时,您总是会遇到泛型问题。 ;-) 从长远来看,理解和使用它们确实是值得的。
    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多