Расширение класса дженериков с помощью вложенных дженериков

В машинописи есть способ расширить класс таким образом:

class ChildClass<Wrapper<A>> extends SuperClass<A>

Это не работает, но идея заключалась бы в том, чтобы обернуть универсальный тип в известную конструкцию. Вот документы:

https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md

Это звучит немного похоже на эту проблему:

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

Я не делаю много уп, поэтому я не очень знаком с такими вещами, как ковариация и контравариантность, любая помощь будет оценена.

1 ответ

Решение

Нет смысла писать ChildClass<Wrapper<A>> перед расширением, потому что там вы объявляете параметры универсального типа. Это означает, что вы можете дать им имя и, если вам нужно, ограничение (например, ChildClass<A extends Wrapper>). Что значит Wrapper<A> значит в этом контексте? Компилятор не может понять это.

То, что абсолютно возможно, это использовать Wrapper<A> на другой стороне тянется, потому что там A не является (формальным) параметром типа, но является аргументом типа. Это означает, что вы используете параметр типа, определенный ранее, и с его помощью вы можете создавать новые типы.

Таким образом, в зависимости от того, что вы действительно хотите сделать, для вас есть два варианта:

AприсваиваетсяWrapper

Когда вы хотите убедиться, что A это Wrapper или производный класс, используйте общее ограничение:

class ChildClass<A extends Wrapper> extends SuperClass<A>

Aявляется аргументом типаWrapper<>

Если Wrapper<> сам по себе универсальный класс или интерфейс, и вы хотите использовать A в качестве аргумента типа сделайте это:

class ChildClass<A> extends SuperClass<Wrapper<A>>
Другие вопросы по тегам