Могут ли мономорфные дженерики наследовать общий базовый класс?

Предположим, я бы разработал новый язык программирования. L.

  • L должен поддерживать вывод типов и проверку типов во время компиляции, специально поддерживать операции времени компиляции:
    • isSubtypeOf проверить, является ли тип подтипом другого типа
    • DownCast приведите тип к одному из его супертипов
  • L также поддерживает общий синтаксис, который, например, может быть переведен с помощью мономорфизации

Предположим следующий синтаксис для L (пример)

class Concrete {
  foo: Int
  bar: Boolean
}

class Property<T> {
  value: T
}

class Bar {
  foo: Property<Int>
  bar: Property<Boolean>
}

Теперь после мономорфизации код может выглядеть так (аналогично тому, как, например, показано в примере ржавчины о мономорфизации):

class Concrete {
  foo: Int
  bar: Boolean
}

class Property_Int {
  value: Int
}

class Property_Boolean {
  value: Boolean
}

class Bar {
  foo: Property_Int
  bar: Property_Boolean
}

Но в этом мономорфном коде вся информация об общности Property_Int и Property_Booleanпотеряны. Но я все еще хочу использовать эту информацию, доступную во время компиляции.

Вопрос

Было бы разумно сделать такую ​​мономорфизацию, когда оба мономорфных экземпляра наследуют общую основу? Это вообще часть концепции или есть еще одна концепция в отношении универсальных шаблонов, которая лучше соответствовала бы этому требованию?

class Any {}


class Concrete {
  foo: Int
  bar: Boolean
}

class Property {
  value: Any
}

class Property_Int : Property {
  value: Int
}

class Property_Boolean : Property {
  value: Boolean
}

class Bar {
  foo: Property_Int
  bar: Property_Boolean
}

В этом последнем фрагменте легко было бы статически оценить, что Property_Int и Property_Boolean имеют общую базу.

0 ответов

Другие вопросы по тегам