Ответ
Технически да, но это нарушает принципы типобезопасности и ведет к ошибкам. HashSet может хранить любые объекты, если объявлен как HashSet<Object> или сырой тип.
Проблемы такого подхода:
- Потеря типобезопасности: Компилятор не сможет проверить типы, что приводит к
ClassCastExceptionво время выполнения. - Непредсказуемое поведение
equals()иhashCode(): Разные классы имеют разную логику этих методов. Объекты разных типов могут быть признаны "равными" или иметь одинаковый хэш, что сломает уникальность элементов вHashSet.
Пример (антипаттерн):
HashSet<Object> set = new HashSet<>();
set.add("Hello"); // String
set.add(42); // Integer (автоупаковка)
set.add(List.of(1,2)); // List<Integer>
// Извлечение требует проверки и приведения
for (Object obj : set) {
if (obj instanceof String) {
System.out.println(((String) obj).toUpperCase());
}
// Опасность ClassCastException без instanceof
}
Вывод: Избегайте хранения разнотипных объектов в одном HashSet. Используйте дженерики с конкретным типом (HashSet<String>) или создайте общий интерфейс/суперкласс для элементов.