我有几个界面如下所示:
interface ApiInterface : Context.Element {
@GET(Urls.url)
suspend fun getSomeData(): Data
}
interface Context.Element {
operator fun plus(context: Context): Context
}
我正在努力实现一个 Context
以类似于kotlin的方式实现 CoroutineContext
. 当我试图添加我的改型http接口作为 Context.Element
它最终继承了一些其他函数。代码编译并运行良好,直到我从继承自的apiinterface示例调用函数为止 Context.Element
因此没有任何 @GET
, @POST
或任何改装注解。
如果我运行以下代码:
val context = ApiInterfaceImpl()
context + DifferentApiInterfaceImpl()
我收到一封信 Exception in thread "main" java.lang.IllegalArgumentException: HTTP method annotation is required (e.g., @GET, @POST, etc.). for method Context.plus
.
我相信,如果我能够使改装后的注解处理器跳过继承的函数 Context.Element
这个问题会解决的。有什么办法吗?任何 @Transient
比如函数的注解?我试着用 @JvmSynthetic
但运气不好。
1条答案
按热度按时间xxe27gdn1#
这里的问题不在于注解处理器,而是在于改造的工作方式。它不生成实现类,而是在运行时创建一个代理对象,该代理对象处理所有方法调用并将它们路由到适当的处理程序。所以很明显它不能处理非服务方法。此外,还不清楚如何为该非注解方法提供实现。所以我想说这目前是不可能的。
编辑:由于您正在使用接口上的默认方法来提供实现,我相信它通常应该可以工作,因为
Retrofit
分别处理默认方法。这里的问题可能是Retrofit
只知道java默认方法,默认情况下kotlin不使用它们(为了与Java7及以下版本兼容)。因此,如果让编译器生成java默认方法,它应该可以工作。详情请看这篇文章。