【问题标题】:Reference to multiple bounds generic receiver extension function in Kotlin引用 Kotlin 中的多边界通用接收器扩展函数
【发布时间】:2019-01-24 16:58:59
【问题描述】:

具有扩展功能

fun <T> T.doSomething() where T: A, T: B

如果只有一个泛型绑定A,我可以使用语法(A::doSomething)(instanceOfA) 来引用该函数,但是如何使用多个绑定呢?


例子:

interface Ainterface B,以及与两个接口fun <T> T.doSomething() where T: A, T: B绑定的扩展函数。

现在我设法“覆盖”doSomething,如果一个类扩展了额外的interface C,比如class X: A, B, C

  1. 声明另一个扩展函数fun <T> T.doSomething() where T: A, T: B, T: C
  2. 在类内声明doSomething() X

如果我在两个“覆盖”函数中直接使用doSomething() 会导致无限递归。如何引用原版fun <T> T.doSomething() where T: A, T: B(如super.doSomething())?

【问题讨论】:

  • 请给出一个清晰的例子来说明你想要达到的目标。 A 和 B 从哪里来?

标签: generics kotlin kotlin-extension


【解决方案1】:

有点丑,但是

fun <T> T.doSomething() where T: A, T: B = ...

// calls the first version of doSomething
fun <T> T.doSomethingHelper() where T: A, T: B = this.doSomething()

@JvmName("doSomethingElse")
fun <T> T.doSomething() where T: A, T: B, T: C = ... // use doSomethingHelper() here

没有@JvmName我得到

java.lang.ClassFormatError: Duplicate method name&signature in class file Simplest_versionKt

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 2018-05-26
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多