簡體   English   中英

如何指定“接受通用類型的通用子類型”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM