Можно ли объединить концепции наследования и параметрического полиморфизма?

Интересно, вообще возможно ли объединить концепции наследования и параметрического полиморфизма («дженерики» "), особенно в отношении дисперсии, но также и с точки зрения того, как (" синтаксис ") и где (сайт-использование / сайт-декларации) они должны быть определены?

Рассмотрим эту точку зрения:

  • Подтипирование, например, S <: T может восприниматься как ковариантное поведение, поскольку входные аргументы, принимающие T , также будут принимать S .
  • . Изменение «дисперсии модели наследования» на инвариантное возможно только на стороне определения путем запрета подтипирования (например, г. добавление модификатора final к определению класса), контр-дисперсия невозможна, насколько я видел в большинстве случаев
  • Параметрический полиморфизм является инвариантным по умолчанию, но может быть сделан совместно / противоположно вариант

Похоже, существует существенное несоответствие концепций между обоими, учитывая

  • проблемы, которые возникли у языков, допуская «небезопасную» ковариацию (например, String [] <: Object [] в Java / C #)
  • различия в том, как наследование / параметрический полиморфизм объявляется и используется по сравнению с наследованием

. В некоторых языках можно увидеть, что оба они прекрасно работают вместе, хотя

class Foo extends Ordered[Foo]

реализует поведение упорядочения / сравнения.

  • . Возможно ли, чтобы концепции наследования и параметрического полиморфизма могли быть унифицированы и получили одно и то же поведение дисперсии по умолчанию (например, ковариация по умолчанию, или это привело бы к необходимости помечать большинство типов аннотацией инвариантности вместо этого, поэтому просто смещая уродство в другой момент)? Было бы это более практичным, как если бы структуры данных тоже стали бы неизменными по умолчанию?
  • Существует ли формальная система, в которой это доказало свою работоспособность?
  • Какие параметры / изменения синтаксиса будут наиболее вероятными, независимо от того, конкретного языка программирования?
  • Есть ли какой-нибудь рабочий пример или язык, на котором это / что-то подобное уже работает?
5
задан soc 18 July 2011 в 15:35
поделиться