Параметры обобщенного типа более высокого порядка (или рекурсивные?) В котлине

Я прототипирую какой-то весьма декларативный код, и тип вывода и безопасности, который поставляется с Kotlin, помогает много. Одна из целей заключается в том, что расширения (подклассы) первичных типов глупо просты в реализации. Чтобы поддерживать вывод и выразительность богатого типа, я нашел некоторый успех в определении общих функций расширения, спроектированных против подклассов. Вся информация о типе методов подкласса без какой-либо дополнительной реализации подкласса, это здорово.

Поэтому я пытаюсь написать богатую общую функцию, которая поддерживает как можно больше информации о типе. Проблема сводится к тому, что эта функция работает с потенциально рекурсивно-родовыми типами, и я хочу перетасовать параметры типового типа.

Это невозможно описать без примера. Поэтому рассмотрим:

open class G<in T> class A<in T> : G<T>() class B<in T> : G<T>() class C<in T> : G<T>() val ba = B<A<*>>() val cb = C<B<*>>() 

Нам нужна функция, которая действительно может это сделать, за исключением, в общем,

 fun B<A<*>>.doTransitiveThing(c: C<B<*>>) : C<A<*>> { // implement } val ca = ba.doTransitiveThing(cb) // Returns C<A<*>> 

Критерии цели:

  • Принимает C в качестве параметра и возвращает C , за исключением другого типового параметра типа
  • Я хотел бы обобщить это поведение как функцию расширения всех подклассов G
    • Это должна быть функция расширения, поэтому, используя общие типы, мы можем иметь тип подкласса и гарантировать, что аргумент имеет общий тип типа приемника.
    • Другими словами, нам нужна функция расширения для подклассов G поэтому аргумент должен быть C<B<*>> вместо C<G<*>> при вызове на B<A<*>>

Это описывает суть проблемы. Я не уверен, что язык способен поддерживать то, что я хочу. Я не уверен, что стирание типа является фактором, который делает это невозможным, но пока я не могу его найти (возможно, я мог бы использовать помощь, если это так).


Близко

 fun < TargetGenericType, Arg1Type: G<*>, ReceiverType: G<TargetGenericType>, Arg2Type: G<Arg1Type>, ResultType: G<TargetGenericType> > ReceiverType.doTransitiveThingGeneric(x: Arg2Type): ResultType { //implement } val ca2 = ba.doTransitiveThingGeneric(cb) 

но есть несколько проблем

  • Он возвращает G<A<*>> вместо C<A<*>> . Было бы неплохо, если бы он мог вернуть C и не потерять информацию о типе (иначе я вообще не использую эту функцию)
  • Технически нет гарантии, что ReceiverTypeArg1Type

Размышляя о будущем, если бы что-то вроде следующего было действительным Котлин, я думаю, что это касается моей проблемы

 fun < TargetGenericType, ReceiverBaseType<T>: G<T>, typealias ReceiverType = ReceiverBaseType<TargetGenericType>, ParamBaseType<U>: G<U>, typealias ParamType = ParamBaseType<ReceiverBaseType<*>>, ResultType: ParamBaseType<TargetGenericType> > ReceiverType.doTransitiveThingHigherOrderGeneric(x: ParamType): ResultType { //implement } 

Есть ли причина, по которой это невозможно сделать? например, добавлен как функция на языке? Я сочувствую логистическим причинам, но мне любопытно, возможно ли это в принципе и в принципе.

Последние примечания:

  • Это напоминает мне псевдонимы типов, за исключением самих параметров типового типа. На самом деле я включил это ключевое слово в пример, если оно помогает переваривать. Это не единственная часть, но обратите внимание на <T> и <U> в синтаксисе.
  • Это почти напоминает мне о Монадах, кроме как сами определения классов, если это имеет смысл в каком-то ручном волнительном, интуитивном способе.
  • Я понятия не имею, как реализовать тело еще, но я до сих пор не дошел, так как я все еще пытаюсь понять, возможна ли подпись: p

Solutions Collecting From Web of "Параметры обобщенного типа более высокого порядка (или рекурсивные?) В котлине"