Проблема 2D-массивов и обобщений (Java) - PullRequest
2 голосов
/ 25 ноября 2011

У меня проблема с пониманием некоторых ошибок компилятора, касающихся 2D-массивов (ArrayList, содержащих ArrayList) и обобщенных элементов.Мое понимание дженериков не самое лучшее, поэтому я попытался изучить проблему заранее и все еще был в замешательстве.

Согласно комментариям к 2D динамическому массиву с использованием ArrayList в Java , вы можетеНе смешивайте массивы с генериками (или, скорее, вы можете с @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
        }
    }

Две строки, которые я закомментировал, были моими первоначальными попытками инициализации массивов.Компилятор пожаловался, когда я попробовал это, и выдал мне указанную ошибку.Что означает эта ошибка?Я думаю, что обе стороны оператора объявления являются переменными.

Осмотревшись, я обнаружил, что должен использовать метод add (E e) ArrayList.Но в чем главное отличие?По-новому я инициализирую массивы, разве это не «смешивает массивы с обобщениями»?

1 Ответ

1 голос
/ 25 ноября 2011

Get ВОЗВРАЩАЕТ объект по заданному индексу, его нельзя использовать для SET объекта.

вот что вы МОЖЕТЕ сделать с помощью 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
...