Совместимость объединений¶
Поскольку понимание поведения типа Union
при проверке на совместимость может вызывать противоречия, эта совсем крохотная глава будет посвящена этому механизму.
Совместимость¶
Чтобы было проще понять суть противоречий, возникающих у разработчиков при понимании механизма совместимости типов объединение, стоит начать с повторения совместимости объектных типов.
Как известно к данному моменту, объектный тип A
совместим с объектным типом B
, если первый содержит все обязательные признаки второго. Кроме того члены, участвующие в проверке на совместимость, не обязаны принадлежать к идентичным типам, достаточно, чтобы они также были совместимы. Утрированно всё сказанное можно перефразировать как - тип, обладающий большим количеством совместимых признаков, совместим с типом, обладающим меньшим количеством признаков. Или даже - больший тип совместим с меньшим типом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Любому разработчику, начавшему свою карьеру с языка, реализующего ооп парадигму, подобное поведение кажется само собой разумеющимся. Так вот, с типом объединение (Union
) все в точности наоборот. Точнее может показаться, что наоборот, хотя на самом деле это совершенно другой случай.
1 2 3 4 5 6 7 8 |
|
В случае с совместимостью объекта, значение, принадлежащее к большему типу, обладает всеми необходимыми признаками, требующимися для успешного выполнения операций, предназначенных для меньшего типа. В случае с типом объединение - чем больше типов его определяют, тем больше шансов, что значение будет принадлежать к типу, отсутствующему в меньшем типе.
В нашем примере переменная с типом Bigger
, помимо прочего, может быть ассоциирована со значением, принадлежащим к типу boolean
, который не определяет множество типа Smaller
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|