Программирование | Отладка | Web-технологии | Microsoft Office | Теор.информатика | Рсслед-Рµ операций | Операц. СЃРёСЃ-РјС‹ | Новости |
Проектирование РРЎ | РСЃСЃРє. РёРЅС‚-С‚ | Трансляторы | РћР± авторах | Карта сайта | РџРѕРёСЃРє |
Язык программирования Turbo Pascal |
Среда программирования Delphi 6 |
Язык программирования C++ |
Язык программирования C# |
Язык программирования Assembler |
Язык программирования Go |
Язык программирования Haskell |
Язык программирования Java |
Язык программирования Kotlin |
Язык программирования LISP |
Язык программирования Prolog |
Язык программирования Python |
Параллельные алгоритмы |
Сети Петри |
Начала |
Отладчик Turbo Debugger |
РћСЃРЅРѕРІС‹ HTML |
Технология Flash |
Язык программирования Perl |
Основы языка PHP |
РћСЃРЅРѕРІС‹ PhotoShop |
РћСЃРЅРѕРІС‹ JavaScript |
РћСЃРЅРѕРІС‹ CSS |
РћСЃРЅРѕРІС‹ CorelDRAW |
Библиотека jQuery |
Текстовый процессор Microsoft Word |
Рлектронные таблицы Microsoft Excel |
Система управления базами данных Microsoft Access |
Рспользование VBA РІ Microsoft Excel |
Место информатики в системе наук |
Общие сведения об информации |
Кодирование информации в теории Шеннона |
Основные понятия теории алгоритмов |
Классические формализации понятия 'алгоритм' |
Понятие рекурсии |
Сложность алгоритма |
Методы разработки алгоритмов |
Сложность задачи |
Рнформационное моделирование |
Основные понятия теории графов |
Алгоритмы поиска на графах |
Матроиды. 'Жадные' алгоритмы |
Динамическое программирование |
Алгоритмы |
UNIX Рё Linux |
Унифицированный язык моделирования UML |
Введение в машинное обучение с использованием Python |
Основы создания нейросети на Python |
Глубокое обучение на Python |
Начала |
Динамические структуры данных |
Библиотека RX |
Основные классы и события Delphi |
Основные компоненты Delphi |
Организация потоков |
Технология COM |
Язык программирования Object Pascal |
Локальные БД в Delphi |
Библиотека OWL |
Библиотека Qt |
Библиотека STL |
Библиотека шаблонов классов Borland |
Основы компьютерной графики |
Динамические структуры данных |
Начала |
Обработка исключительных ситуаций |
Оптимизация с помощью ассемблера |
Основы объектно-ориентированного программирования |
Потоки ввода-вывода |
Разное |
Редактор Resource Workshop |
Среда Visual C++ |
Программирование в Microsoft Visual C++ 2010 |
Технология CUDA |
Технология OLE |
Начала |
16-битное программирование |
32-битное программирование |
Основы логического программирования |
Динамические структуры данных |
Visual Prolog |
Библиотека PyQt5 |
Библиотека Tkinter |
Визуализация данных |
Начала |
Задачи ComputerScience |
Рекурсия |
Вкладка RXControls |
Вкладка RXDBAware |
Вкладка RXTools |
Вкладка Standard |
Вкладка Additional |
Создание Internet-приложений |
Вкладка System |
Вкладка Win32 |
Вкладка Servers |
Технология ADO |
Вкладка QReport |
Вкладка InterBase |
Вкладка Dialogs |
Начала |
Среда программирования. Язык С/С++ |
На этом шаге мы поговорим про подстановочные типы
Исследователям систем типов уже давно известно, что жесткие системы обобщенных типов использовать довольно неприятно. Поэтому создатели Java придумали изящный и в то же время не менее безопасный выход из положения: подстановочные типы. Рассмотрим пример:
Pair<? extends Employee>
Этот подстановочный тип означает любой обобщенный тип Pair, параметр типа которого обозначает подкласс, производный от класса Employee, в частности класс Pair<Manager>, но не класс Pair<String>.
Допустим, требуется написать следующий метод, который выводит пары сотрудников:
public static void printBuddies(Pair<Employee> p) { Employee first = p.getFirst(); Employee second = p.getSecond(); System.out.println(first.getName() + " and " + second.getName() + "are buddies."); }
Как было сказано ранее, передать объект типа Pair<Manager> этому методу нельзя, что не совсем удобно. Но из этого положения имеется простой выход - использовать подстановочный тип следующим образом:
public static void printBuddies(Pair<? extends Employee> p) {...}
То есть тип Pair<Manager> является подтипом Pair<? extends Employee>. Заметим, что подстановки не могут нарушить тип Pair<Manager> по ссылке Pair<? extends Employee>. Рассмотрим следующий пример:
Pair<Manager> managerBuddies = new Pair<>(ceo, cfo); Pair<? extends Employee> wildcardBuddies = new managerBuddies; wildcardBuddies.setFirst(lowlyEmployee);
При вызове метода setFirst() произойдет ошибка соблюдения типов. Чтобы стала причина этой ошибки, рассмотрим поподробней обобщенный класс типа Pair<? extends Employee>. У него имеются следующие методы:
? extends Employee getFirst() void setFirst(? extends Employee)
Причина в методе setFirst(). Компилятору требуется какой-нибудь подтип Employee, но неизвестно, какой именно. Он отказывается передать любой конкретный тип, поскольку знак подстановки ? может и не совпасть с этим типом. При вызове метода getFirst() такого затруднения не возникает. Значение, возвращаемое методом getFirst(), вполне допустимо присвоить переменной ссылки на объект типа Employee. В этом и состоит главный смысл ограниченных подстановок.
На следующем шаге мы рассмотрим ограничение супертипа на подставновки