我正在try 创建一个带有泛型参数的抽象类,该类将具有应该调用方法without having to specify type parameters的子类. 到目前为止,我有这样的 idea :

abstract class AbstractClass<T : Any> @Autowired constructor(protected val delegate: MyService) {
    inline fun <T: Any> myMethod(param: Any): T? {
        return delegate.myMethod(param).`as`(T::class.java)
    }
}

And implementation:

class TesterWork @Autowired constructor(delegate: MyService) : AbstractClass<Tester>(delegate) {
}

Now when calling myMethod I have to specify the type argument:

testerWork.myMethod<Tester>("test")

我想知道是否有可能自动推断类型参数?

推荐答案

不能将类的泛型参数用作具体化泛型(获取其T::class标记),因为在运行时,泛型参数会被删除:Kotlin遵循Java's type erasure practice,并且没有类的具体化泛型.

有鉴于此,你需要传递并存储一个Class<T>令牌,以便使用它.

另外,在您的示例中,myFunction介绍了一个通用参数,它将是一个新的泛型,没有以任何方式连接到类泛型参数(命名T只增加混淆,考虑它们T1T2).如果我没弄错的话,你指的是类的泛型.

Probably what you can do is declare an abstract val that would store a class token and rewrite the function so that it uses the stored class token:

abstract class AbstractClass<T : Any> constructor(protected val delegate: MyService) {
    protected abstract val classToken: Class<T>

    fun myMethod(param: Any): T? {
        return delegate.myMethod(param).`as`(classToken)
    }
}

Then, deriving from AbstractClass will require overriding the classToken:

class TesterWork constructor(delegate: MyService) : AbstractClass<Tester>(delegate) {
    override val classToken = Tester::class.java
}

After that, you will be able to call the function on TesterWork instance without specifying the generic parameter:

val service: MyService = ...
val t: Tester? = TesterWork(service).myMethod("test")

Kotlin相关问答推荐

如何在Jetpack Compose中的列中渲染图像

测试Compose Multiplatform UI时,为另一个文件设置ComposeRule()

如何在Kotlin中为两个数据类创建可重用的方法?

如何访问方法引用的接收者?

编译后的JavaFX应用程序立即以静默方式崩溃

在jetpack compose中将默认方向设置为横向?

顶级属性的初始化

如何在 Hibernate Panache 中进行部分搜索

如何连接两个 kotlin 流?

我什么时候可以在 LazyList 或 Column 的范围内使用 Composable?

Kotlin - 创建指定长度的随机整数的 ArrayList?

Kotlin 语言是如何用 Kotlin 编写的?

Kotlin 的 isNullOrBlank() 函数是否可以导入 xml 以用于数据绑定

防止导航到同一个片段

如何在 Kotlin 中传递有界通配符类型参数?

Kotlin 的类型具体化使哪些在 Java 或 Scala 中无法实现的成为可能?

Kotlin使用运行时断言进行空判断?

如何在Kotlin中创建无限长的序列

生成Kotlin类图

在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件