如何在 lambda "accepts generic sub-type of a generic type" 中指定?

How to specify in a lambda "accepts generic sub-type of a generic type"?

这个问题是我最近做的一个问题的衍生

虽然那个解决了,但我马上又遇到了一个新的类似性质的问题,但我也找不到解决办法。

示例:

abstract class Endpoint<T>() {

    private val myList: MutableList<(T) -> Unit> = mutableListOf()

    fun <E : T> addToList(cbk: (E) -> Unit) { <-- E extends T
        myList.add(cbk)
    }

}

用法示例为

部分封印class

sealed class MainSealedClass {
    data class ChildClass(val someParam: Int): MainSealedClass()
}

以及函数调用

anEndpointInstance.addToList<ChildClass>{it: ChildClass -> 
    // do something here
}

我尝试执行以下操作,但似乎不允许这样做

val myList: MutableList<(out T) -> Unit> <--- Unsupported error shows up

有没有办法做到这一点而不必在 class 级别添加额外的声明?

我考虑过使用 inline reified 但该函数需要访问 Endpoint 实例的私有字段,所以我不想使用该选项。

我认为该语言不支持指定函数类型参数的变体,或引用具有未定义的泛型类型的函数。例如,如果要获取对泛型函数的引用,则必须在函数类型声明中指定其泛型类型。

无论如何这里都有可疑的用处。如果你有一个函数列表,每个函数都有不同的输入类型,那么当你从列表中检索一个函数时,你将无法调用它,因为你不知道它支持哪种输入类型。你还不如有一个 MutableList<Any>.

感谢 Tenfour04 的知识,我能够找到解决我的问题的方法。我不认为这可以解决我的问题,但鉴于它显然无法按我的预期完成,下一个最好的办法是在包装器的帮助下解决这个问题。

下面是我的代码如何使用我的问题中的示例进行工作

abstract class Endpoint<T>() {

    private val myList: MutableList<(T) -> Unit> = mutableListOf()

    fun add(cbk: (T) -> Unit) {
        myList.add(cbk)
    }

    inline fun <reified N : T> addToList(crossinline callback: (N) -> Unit) {
        add { if (it is N) callback.invoke(it) }
    }

}

它的用法是我在问题中想要的方式,此时没有任何变化。