Я изучаю Java и сейчас читаю эффективную Java Joshua Bloch.Классы с параметрическим ключом для карты
В пункте 29 он обсуждает параметризованные ключи типа для карты для создания гетерогенной карты типа безопасного типа. Вот код:
class Favorites {
private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>();
public <T> void putFavorite(Class<T> type, T instance) {
if (type == null)
throw new NullPointerException("Type is null");
favorites.put(type, instance);
}
public <T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type));
}
}
Он продолжает говорить, что
вредоносный клиент может легко повредить тип безопасности в Избранное , например, просто с помощью объекта класса в сыром виде. Но полученный код клиента генерирует непроверенное предупреждение, когда оно было составлено .
Я знаю, что Class<T>
будет стерто до класса. Но я не уверен, как вредоносный клиент может нарушить безопасность типа во время компиляции. Я пробовал разные способы, но я всегда получал ошибку компилятора, как я и ожидал.
Может кто-нибудь, пожалуйста, скажите, что именно сказал Джошуа Блох в приведенной выше строке?
Или в менее странном виде: 'Класс integerClass = Integer.class; favorites.putFavorite (integerClass, "foo"); ' –
Perfect. Огромное спасибо. –
Дело в том, что '' в подписи помогает избежать проблем, но для обеспечения чистых данных вам необходимо предотвратить коррупцию: реализация putFavorite должна была выполнить: 'избранное.put (type, type.cast (instance)) ' –