Подтвердить что ты не робот

Ошибка: создание Generic Array

Я не понимаю ошибку создания Generic Array.
Сначала я попробовал следующее:

  public PCB[] getAll() {
       PCB[] res = new PCB[list.size()];
           for (int i = 0; i < res.length; i++) {
               res[i] = list.get(i);
            }
       list.clear();
       return res;
}


Затем я попытался сделать это:

PCB[] res = new PCB[100];


Я должен упустить что-то, что кажется правильным. Я попробовал посмотреть, что я действительно сделал. И ничего не щелкает.


Мой вопрос: что я могу сделать, чтобы исправить это?


ошибка:

.\Queue.java:26: generic array creation
PCB[] res = new PCB[200];
            ^
Note: U:\Senior Year\CS451- file      
uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

Инструмент завершен с кодом выхода 1

4b9b3361

Ответ 1

Вы не можете создавать массивы с общим типом компонента.

Создайте массив явного типа, например Object[]. Затем вы можете применить это к PCB[], если хотите, но я не рекомендую его в большинстве случаев.

PCB[] res = (PCB[]) new Object[list.size()]; /* Not type-safe. */

Если вам нужна безопасность типа, используйте массив, например java.util.List<PCB> вместо массива.

Кстати, если list уже есть java.util.List, вы должны использовать один из его методов toArray(), а не дублировать их в коде. Однако это не затрагивает проблему безопасности типов.

Ответ 2

Помимо способа, предложенного в "возможном дубликате", другой основной способ обойти эту проблему состоит в том, чтобы сам массив (или, по крайней мере, один шаблон) был предоставлен вызывающим, который, мы надеемся, узнает конкретный типа и может таким образом безопасно создавать массив.

Это методы, подобные ArrayList.toArray(T[]). Я бы предложил вам взглянуть на этот метод для вдохновения. Еще лучше, вероятно, вы должны использовать этот метод в любом случае, как отмечали другие.

Ответ 3

Ниже приведен массив, который вы хотите, сохраняя при этом безопасность типов.

PCB[] getAll(Class<PCB[]> arrayType) {  
   PCB[] res = arrayType.cast(java.lang.reflect.Array.newInstance(arrayType.getComponentType(), list.size()));  
   for (int i = 0; i < res.length; i++)  {  
      res[i] = list.get(i);  
   }  
   list.clear();  
   return res;  
}

Как это работает, подробно объясняется в мой ответ на вопрос о том, что Кирк Волл связан как дубликат.