接口上的内联扩展功能可传递经过修饰的通用参数

时间:2019-04-26 21:59:56

标签: generics kotlin inline-functions reification

首先,我知道了https://discuss.kotlinlang.org/t/inline-methods-in-interfaces/1630,但我想就如何最好地解决这些限制以及这种模式在总体上是否合理提出建议。

我有一个Thing

interface Thing

我还有一项服务,可以通过Spring或其他方式进行连接:

class ThingService {
    fun doStuffOn(thing: Thing) {}
    inline fun <reified T> doTypeStuffOn(thing: Thing) {}
}

现在,我真的很想能够说something.doStuff()而不是thingService.doStuffOn(thing)。因此,我创建了一个助手界面:

interface ThingServiceHelper {
    val service: ThingService
    fun Thing.doStuff() = service.doStuffOn(this)
}

太棒了!现在,如果实现该接口,我可以做Thing.doStuff(),我会很高兴...

...直到我要这样拨打doTypeStuff。在逻辑上,我尝试将其添加到界面中:

inline fun <reified T> Thing.doTypeStuffOn() = context.doTypeStuffOn<T>(this)

但是,没有。 'inline' modifier is not allowed on virtual members. -_-

我喜欢这种模式,它对于我拥有的用例非常有用。当然,我可以将interface设为abstract class,但我真的不想这么做,因为实现它的东西已经有一个与此无关的基类,并且接口更多总体上灵活。

我不能将函数移出接口,因为它取决于接口内的抽象成员service。 rr有什么想法吗?为什么不能在接口上放置内联扩展函数?他们不是会员!我勒个去。我至少想在这里了解语言设计注意事项。

0 个答案:

没有答案