Это в основном следующее: question со вчерашнего дня. Я попытался реализовать «самый общий способ» (я мог подумать), чтобы создать «действительно» un-modifiable коллекции. Код ниже работает нормально; но это требует подавления предупреждений («rawtypes» и «unchecked»).Как избежать предупреждений о генераторах при использовании «сырых типов» в качестве статического поля/типа возврата?
Я пробовал всевозможные вещи, чтобы избежать этих предупреждений; но просто не мог найти альтернативы. Итак, мой вопрос: есть ли чистый способ избежать предупреждений, которые я подавляю?
(я видел это другое question, но я не уверен на 100%, если он действительно применим к моему коду, так как я не уверен, могу ли я записать интерфейс «Generator», не используя там сырой тип).
private interface Generator<T> {
T generateNewInstance();
}
@SuppressWarnings("rawtypes")
private final static Generator ListGenerator = new Generator<List>() {
@Override
public List generateNewInstance() {
return new ArrayList();
}
};
public static <T> List<T> unmodifiableListBasedOnCloneOf(List<T> elements) {
@SuppressWarnings("unchecked")
List<T> newInstance = makeNewInstanceOf(elements.getClass(), ListGenerator);
newInstance.addAll(elements);
return Collections.unmodifiableList(newInstance);
}
private static <T> T makeNewInstanceOf(Class<T> incomingClass, Generator<T> fallbackGenerator) {
try {
return (T) incomingClass.newInstance();
} catch (IllegalAccessException | InstantiationException e) {
return fallbackGenerator.generateNewInstance();
}
}
Я не очень понимаю, что вы пытаетесь сделать здесь: если список заворачивают в 'unmodifiableList', почему имеет значение какой тип базовый список? Почему не 'Collections.unmodifiableList (новый ArrayList <> (elements))' достаточно? –
Просто прочитайте мой другой вопрос. Дело в том, что это не так. Этот метод Collections добавляет ** декоратор ** в существующий список. Если вы получаете доступ к этому «первоначальному списку» через не оформленный интерфейс, вы можете изменить этот список; и тогда ваш предположительно не изменяемый список изменяется под обложкой. – GhostCat
'Collections.unmodifiableCollection (новый ArrayList <> (элементы))' не является представлением 'elements': он копирует' elements' в новый список (точно так же, как вы здесь), а ссылка на этот новый список isn доступным ничем, кроме «немодифицируемого сотворения». –