這個問題是我最近在這里提出的一個衍生問題
雖然解決了那個問題,但我立即面臨了一個類似性質的新問??題,但我也無法找到解決方案。
示例:
abstract class Endpoint<T>() {
private val myList: MutableList<(T) -> Unit> = mutableListOf()
fun <E : T> addToList(cbk: (E) -> Unit) { <-- E extends T
myList.add(cbk)
}
}
用法示例是
一些密封類
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
有沒有辦法做到這一點而不必在類級別添加額外的宣告?
我考慮過使用inline reified,但該函式需要訪問Endpoint實體的私有欄位,所以我不想使用該選項。
uj5u.com熱心網友回復:
我不認為該語言支持指定函式型別引數的變化,或者對具有未定義的泛型型別的函式的參考。例如,如果你想獲得一個泛型函式的參考,你必須在函式型別宣告中指定它的泛型型別。
無論如何,這里有可疑的用處。如果你有一個函式串列,每個函式都有不同的輸入型別,那么當你從串列中檢索一個函式時,你將無法呼叫它,因為你不知道它支持哪種輸入型別。你還不如有一個MutableList<Any>.
uj5u.com熱心網友回復:
感謝 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) }
}
}
它的用法是我在我的問題中想要的方式,此時沒有任何變化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464412.html
