如何在 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) }
}
}
它的用法是我在问题中想要的方式,此时没有任何变化。
这个问题是我最近做的一个问题的衍生
虽然那个解决了,但我马上又遇到了一个新的类似性质的问题,但我也找不到解决办法。
示例:
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) }
}
}
它的用法是我在问题中想要的方式,此时没有任何变化。