Расширение класса дженериков с помощью вложенных дженериков
В машинописи есть способ расширить класс таким образом:
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>>