我正在嘗試實作一個接受泛型引數的函式定義,只要它擴展另一個特定的泛型型別。簡而言之; 引數 A 必須擴展引數 B,其中 A 和 B 都是通用的。
我的示例如下
abstract class Endpoint<T>(
) {
private val myList: MutableMap<Class<T>, MutableList<((T) -> Unit)>> = mutableMapOf()
fun addToList(
index: Class<E>, <-- E extends T
value: (E) -> Unit
) {
myList[index] = (myList[index] ?: mutableListOf()).apply { add(value) }
}
}
用法示例是
一些密封類
sealed class MainSealedClass {
data class ChildClass(val someParam: Int): MainSealedClass()
}
和函式呼叫
anEndpointInstance.addToList(MainSealedClass.ChildClass::class.java, "some value")
我不想在抽象類宣告中定義 E,因為 T 已經在那里定義了。
我也嘗試執行以下操作:
將 myList 定義為接受擴展 T 的鍵
val myList: MutableMap<Class<in T>, MutableList<String>>
將 E 定義為 T 型別(找不到如何指定它在函式中擴展 T
fun <E:T> addToList(
index: Class<E>,
value: (E) -> Unit
) {
myList[index] = (myList[index] ?: mutableListOf()).apply { add(value) }
}
fun addToList(
index: Class<in T>,
value: (E) -> Unit
) {
myList[index] = (myList[index] ?: mutableListOf()).apply { add(value) }
}
fun <E> addToList(
index: Class<E>,
value: (E) -> Unit
) where E : T {
myList[index] = (myList[index] ?: mutableListOf()).apply { add(value) }
}
但它永遠不會奏效。有沒有辦法實作這一目標?我在 StackOverflow 中找不到任何可以解決這種情況的內容。
uj5u.com熱心網友回復:
你的方差倒置了。如果您希望您的地圖接受 T 的子型別的類,那么它需要是<out T>. 如果你不檢查鑰匙,你可能只是把Class<*>.
您宣告函式的第一種方式是正確的。
abstract class Endpoint<T>(
) {
private val myList: MutableMap<Class<out T>, MutableList<String>> = mutableMapOf()
fun <E : T> addToList(
index: Class<E>,
value: String
) {
myList.getOrPut(index, ::mutableListOf).add(value)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/460173.html
