gpt4 book ai didi

generics - 具有通用参数和使用类型参数的方法的 Kotlin 抽象类

转载 作者:IT老高 更新时间:2023-10-28 13:41:20 26 4
gpt4 key购买 nike

我正在尝试创建一个带有泛型参数的抽象类,该类将具有应该调用方法的子类无需指定类型参数。到目前为止我有这个:

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

及实现:

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

现在当调用 myMethod 我必须指定类型参数:

testerWork.myMethod<Tester>("test")

我想知道是否可以自动推断类型参数?我可以以某种方式重做 myMethod 吗?请注意,我需要在方法中包含 T::class.java

最佳答案

您不能将类的泛型参数用作具体泛型(获取其 T::class 标记),因为在运行时泛型参数会被删除:Kotlin 遵循 Java's type erasure practice并且没有具体的类泛型。
(Kotlin 有 reified generics 仅适用于内联函数)

鉴于此,由您决定是否传递和存储 Class<T> token ,以便您可以使用它。

另外,myFunction在您的示例中引入了一个泛型参数,它将是一个新的泛型,不以任何方式连接到类泛型参数(同时命名 T 只会增加混淆,考虑它们 T1T2 )。如果我没看错,你的意思是类的泛型。

您可以做的可能是声明一个摘要 val这将存储一个类 token 并重写函数,以便它使用存储的类 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)
}
}

然后,从 AbstractClass 派生将需要覆盖 classToken :

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

之后,您将能够调用 TesterWork 上的函数没有指定泛型参数的实例:

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

关于generics - 具有通用参数和使用类型参数的方法的 Kotlin 抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36012190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com