我想创建一个抽象类与泛型参数,它将有子类应调用方法而不必指定类型参数。 我有这个至今:Kotlin抽象类与泛型参数和使用类型参数的方法
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类型”?为什么我们必须重新指定类型? – NikolaB
@NikolaB,当你为**类和它的方法添加一个泛型参数时,那些将是不相互连接的不同参数,这就是我的意思。否则,你肯定可以在函数中使用该类的泛型参数。至于抽象类,JVM上的泛型以不同的方式工作:对于每个派生类,方法代码不会被复制,因此在派生类中指定具体类型代替泛型参数将无济于事:方法的代码是仍然在基类中,然后泛型将从其中删除。 – hotkey
@NikolaB,可能是阅读* https://en.wikipedia.org/wiki/Generics_in_Java中的type erasure *部分会使事情更加清晰。 – hotkey