![](/img/trans.png)
[英]Incompatible Generic Types: Cannot specify sub-type when using .class with generic type
[英]How to specify "accepts generic sub-type of a generic type"?
我正在嘗試實現接受通用參數的 function 定義,只要它擴展了另一個特定的通用類型。 簡而言之; 參數 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) }
}
}
用法示例是
一些密封 class
sealed class MainSealedClass {
data class ChildClass(val someParam: Int): MainSealedClass()
}
和 function 電話
anEndpointInstance.addToList(MainSealedClass.ChildClass::class.java, "some value")
我想不必在抽象 class 聲明中定義 E,因為 T 已經在那里定義了。
我也嘗試執行以下操作:
將 myList 定義為接受擴展 T 的鍵
val myList: MutableMap<Class<in T>, MutableList<String>>
將 E 定義為 T 類型(無法在 function 中找到如何指定它擴展 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 中找不到任何可以解決這種情況的信息。
你得到了你的方差反轉。 如果你想讓你的 map 接受 T 子類型的類,那么它需要是<out T>
。 如果您不檢查密鑰,您可以只放置Class<*>
。
您聲明 function 的第一種方式是正確的。
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)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.