当前位置: 首页 > 知识库问答 >
问题:

如何指定“接受泛型类型的泛型子类型”?

谈禄
2023-03-14

我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数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中找不到任何对这种情况有答案的东西。

共有1个答案

邹麻雀
2023-03-14

你的方差倒过来了。如果你想让你的地图接受T的子类型,那么它必须是

您声明函数的第一种方式是正确的。

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)
    }

}

 类似资料:
  • 问题内容: 我想制作这种形式的通用类: 问题是,我希望T可以是整数或Long,但不能接受Double。因此,仅有的两个可接受的声明将是: 有什么办法吗? 问题答案: 答案是不。至少没有办法使用泛型类型做到这一点。我建议结合使用泛型和工厂方法来执行您想要的操作。 这样可以确保只能创建和实例。尽管您仍然可以声明类型的变量,但它必须为null。

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 考虑一个具有的API,如下所示: 很简单,只有页面大小和跳过计数属性。 此外,现在我还有一些类,它们也包含但未分页。 在我的测试中,我希望他们都能实现一个接口,这样我就可以用一些更基本的测试来生成一个通用的基本测试类。为此,我添加了我认为会起作用的内容: 我将PagedResults更改为: 错误 但现在编译器抱怨PagedResultBase继承的所有地方的使用情况(?)从。 但是,如果我将接口

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 泛型类型 除了反省函数, Swift允许你定义自己的泛型类型. 它们是可以用于任意类型的自定义类、结构体、枚举, 和Array、Dictionary方式类型. 1. 定义泛型类型 定义一个普通的结构体 struct IntStack { var items = [Int]() mutating func push(_ item: Int) { items.appen

  • 我有大约40个API,它们具有类似的基本响应结构,如下所示: 因此,我有一个基本响应类,采用T类型的泛型,如下所示: 因此,对于API A,它返回类型为的对象及其自己的字段,我将返回响应作为控制器中的API响应: 在控制器中:响应数据=新响应();ResponseEntity response=新的ResponseEntity 在swagger中有没有一种方法可以递归地指定响应对象的模型?例如,我