繁体   English   中英

如何用Java Object覆盖Kotlin中的任何参数?

[英]How to override Any parameter in Kotlin with Java Object?

我正在编写一个 retrofit 实现,我有以下接口方法:

suspend fun uploadAvatar(file: Any, sessionToken: String)

在我的实现中,我试图将“文件”参数覆盖为 MultipartBody.Part object:

override suspend fun uploadAvatar(file: MultipartBody.Part, sessionToken: String)

我收到以下错误:

错误信息

我可以看到 okhttp3 写在 Java 中,我假设这就是错误的原因。 如果是这样,我该如何解决? 否则还会发生什么?

这不是因为它写在 Java 中。这是因为您试图通过缩小输入参数的类型来违反接口契约。 该接口声明file可以是任何类型,因为它是 Any 类型。 如果编译器允许您缩小类型定义,那么您的 class 将能够调用file上特定于MultipartBody.Part的函数,然后将您的 class 的实例作为接口类型传递,而其他一些代码可以传递不同的 class 类型到您的 function 作为file ,这没有意义。

我不能建议如何避免这个问题,因为你没有说你是如何使用你的界面的。 我看不出它与 Retrofit 有什么关系。

通常,使用 generics 可能会解决此类问题,但这仅适用于某些用例。 例子:

interface Foo<in T> {
    suspend fun uploadAvatar(file: T, sessionToken: String)
}

class MyFooBodyImpl: Foo<MultipartBody.Part> {
    suspend fun uploadAvatar(file: MultipartBody.Part, sessionToken: String) {
        TODO()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM