Java: Как создать коллекцию определенного родительского типа, а не его подтипов? - PullRequest
1 голос
/ 11 декабря 2008

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

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

Ответы [ 4 ]

3 голосов
/ 11 декабря 2008

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

3 голосов
/ 11 декабря 2008

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

3 голосов
/ 11 декабря 2008

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

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

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

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

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

2 голосов
/ 11 декабря 2008

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

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

см. http://java.sun.com/docs/books/tutorial/reflect/ для получения информации об отражении в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...