Ошибка: создание 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
Ответы
Ответ 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;
}
Как это работает, подробно объясняется в мой ответ на вопрос о том, что Кирк Волл связан как дубликат.