Java: Как создать коллекцию определенного родительского типа, а не его подтипов?

Я изучаю Java для теста (завтра) и задаюсь вопросом о вопросе, который, вероятно, никогда не поднимется, но вызвал у меня любопытство.

Можно ли создать новый класс коллекции, такой как список или что-то, что может содержать только определенный тип, а не его подтипы? Буду ли я использовать дженерики для достижения этой цели?

11.12.2008 05:43:40
4 ОТВЕТА
РЕШЕНИЕ

Не совсем или, по крайней мере, практически.

Подтипы должны работать как множества в математической теории множеств. Если B является подмножеством A, любой элемент в B также является элементом в A.

Таким же образом, если B является подтипом A, любой элемент в B также является элементом A. Таким образом, любая коллекция A должна иметь возможность поддерживать элементы B.

Это, как говорится, может быть обдуманным способом, которым B может переопределить определенные операции, чтобы явно сломать способность использовать это в коллекции или создать его экземпляр.

Я не думаю, что дженерики решат эту проблему.

3
11.12.2008 05:47:36

Вы можете использовать «final» в определении класса содержащегося класса, чтобы запретить его подтипирование. Я не сразу вижу, как вы можете проверить это или ограничить ваши дженерики, чтобы требовать окончательных классов. Вы можете использовать отражение, чтобы проверить, имеет ли класс окончательный набор модификаторов, например, при создании коллекции, и бросить, если это не так.

Если сам класс не является окончательным, вы можете проверить каждый отдельный объект, добавленный в коллекцию, чтобы убедиться, что его класс времени выполнения - это именно тот класс, который хочет коллекция, а не его подкласс.

см. http://java.sun.com/docs/books/tutorial/reflect/ для получения информации о размышлениях о Java.

2
11.12.2008 05:59:29

Если вы создаете собственный класс коллекции, вы можете проверить класс объекта на вставке, используя отражение, и отклонить его, если он не имеет точного типа. В качестве альтернативы, если у вас есть контроль над определением класса для класса, содержащегося в коллекции, его окончательное выполнение предотвратит создание подклассов. (очевидно, это проблема, если вам нужны подклассы для другого использования)

3
11.12.2008 06:00:06

Вопрос в том, зачем тебе это. Если у вас есть список животных, почему вы хотите заполнить этот список только «базовым животным», но не допускать добавление в список собак или кошек. Одна из основных концепций ОО состоит в том, что вы используете экземпляр подкласса везде, где вам нужно, например, в базовом классе ( Википедия: принцип подстановки Лискова ). Если это не относится к вашей ситуации, возможно, что-то не так с вашей иерархией классов.

3
11.12.2008 09:56:17