【发布时间】:2022-01-12 09:16:14
【问题描述】:
我正在探索并积极在 Kotlin 的生产环境中使用泛型。
Kotlin + 泛型对我来说是一个很大的难题,所以也许你可以解释一下并帮助我理解它与 Java 相比是如何工作的。
我有课 AbstracApiClient(不是很抽象)
class AbstracApiClient {
open protected fun makeRequest(requestBuilder: AbstractRequestBuilder) {
// ...
}
}
AbstractRequestBuilder(不是很抽象):
open class AbstractRequestBuilder {
...
}
ConcreteApiClient 继承 AbstractApiClient 应该用从 AbstractRequestBuilder 继承的 ConcreteRequestBuilder 覆盖 makeRequest:
class ConcreteApiClient: AbstractApiClient() {
protected override fun makeRequest(requestBuilder: ConcreteRequestBuilder) {
// ...
}
}
class ConcreteRequestBuilder: AbstractRequestBuilder()
因为我会有更具体的 API 客户端。我想做一个抽象,我可以传递继承的具体请求构建器并覆盖`make requests 方法。
- 我尝试按原样使用它,但不起作用
- 我尝试了这个符号
protected open fun <R: ApiRequestBuilder> make request(request builder: R),但它与我想要的覆盖函数不匹配:protected override fun make request(request builder: ConcreteRequestBuilder)
我还有什么其他选择?我在这里遗漏了什么吗?
注意:在这种情况下我不能使用interface 或abstract classes,所以理想情况下我想找到一种继承和函数覆盖的方法。
【问题讨论】:
-
您能否再解释一下在没有泛型的情况下,目前的方法有什么不适用的?你得到什么错误/使用哪个代码?
-
覆盖方法在这两种情况下都不起作用,因此方法
protected override fun makeRequest(requestBuilder: ConcreteRequestBuilder)无法与我使用的两种指定方法中的任何一种匹配。 -
啊,是的,我明白了。我将尝试在答案中解释
标签: java kotlin generics inheritance abstraction