LINUX.ORG.RU

Ковариантность и динамическая типизация

 ,


0

1

Согласно принципу Лисков, экземпляр подтипа должен вести себя так же, как экземпляр супертипа. И вот у нас Keyboard - подтип Device, мы делаем какой-нибудь List<Device> (как бы супертип) и List<Keyboard> (как бы подтип).

Но на самом деле нет. Если мы рассмотрим полную сигнатуру функции «добавить» с учётом динамической типизации, то оказывается, что попытка вставить Mouse в List<Keyboard> имеет определённое поведение, отличающееся от такового для List<Device>. В первом случае будет ошибка времени выполнения (некорректный тип), а во втором мышь вставится в список.

Т.е. здесь нет ковариантности.

А теперь вопрос: что используется в ковариантности в языках, позволяющих скомпилировать код, вставляющий «нечто» (any,variant,t) в такой вот «псевдоковариантный» контейнер.

Мне кажется, должен быть какой-то костыль для этой ситуации, и я подозреваю, что он может присутствовать в Scala и/или в C#. Кто может что-нибудь сказать?

★★★★★

Последнее исправление: den73 (всего исправлений: 1)

Ответ на: полиглот от anonymous

cito

как цель миграции, интересно оттранслировать какое-нибудь завалящееся легаси на cito хелловорд

cito automatically translates the Ć programming language to C, Java, C#, JavaScript, ActionScript, Perl and D. Ć is a new language, aimed at crafting portable programming libraries, with syntax akin to C#. The translated code is lightweight (no virtual machine, emulation nor large runtime), human-readable and fits well the target language (including naming conventions and documentation comments).

сразу подо всё

получится вундервафля, которая будет жить вечно

anonymous
()
Ответ на: полиглот от anonymous

Надо же, SmaCC даже пилят) Я уж думал, он давно на свалке истории.

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.