Это в основном продолжение этого вопрос из вчерашнего дня. Я попытался реализовать «самый общий способ» (который я мог придумать) для создания «действительно» неизменяемых коллекций. Код ниже работает нормально; но это требует подавления предупреждений («сырые типы» и «непроверенные»).
Я пробовал все, что угодно, чтобы избежать этих предупреждений; но альтернативы просто не мог найти. Итак, мой вопрос: есть ли чистый способ избежать предупреждений, которые я подавляю?
(Я видел этот другой вопрос; но я не уверен на 100%, действительно ли это применимо к моему коду; поскольку я не уверен, смогу ли я записать интерфейс «Генератор», не используя там необработанный тип).
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(new ArrayList<>(elements))
? - person Andy Turner   schedule 21.04.2016Collections.unmodifiableCollection(new ArrayList<>(elements))
не является представлениемelements
: он копируетelements
в новый список (точно так же, как вы это делаете здесь), и ссылка на этот новый список не доступна ни для кого, кромеunmodifiableCollection
. - person Andy Turner   schedule 21.04.2016