kotlin中的高阶(或递归?)泛型类型参数

我正在对一些高度声明的代码进行原型设计,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子类的扩展函数,所以当在B<A<*>> <A <* >>上调用时,参数必须是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

想一想,如果下面的事情是有效的Kotlin,我认为这将解决我的问题

 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>
  • 这几乎让我想起了Monad,除非是类的定义本身,如果这是有意义的手形波浪,直观的方式。
  • 我不知道如何实现这个机构,但是我还没有得到那么多,因为我仍然试图去看签名是否可能:p