【问题标题】:How to write a generic extension method in Kotlin?如何在 Kotlin 中编写通用扩展方法?
【发布时间】:2017-05-06 23:43:58
【问题描述】:

在我正在进行的一个项目中,我发现自己为某些类型编写了一些扩展方法,以便在可选项为 null 时返回默认值。

例如,我可能有一个Boolean? 对象,我想在默认为假的条件表达式中使用它,所以我会这样写:

if (myOptional?.default(false)) { .. }

我已经为几种类型写了这个:

fun Boolean?.default(default: Boolean): Boolean {
    return this ?: default
}

fun Long?.default(default: Long): Long {
    return this ?: default
}

fun Int?.default(default: Int): Int {
    return this ?: default
}

我想知道是否有一种方法可以通用地做到这一点,所以我可以编写一个可用于所有类型的扩展方法?

【问题讨论】:

  • 有什么意义?为什么不直接使用?:?它既标准又更简洁。
  • ....我猜我没有真正的理由哈哈。这只是我开始走下的个人偏好路线。
  • 请注意if中的?.是多余的
  • 很好,伏丹。谢谢!

标签: generics extension-methods kotlin


【解决方案1】:

我不会那样做,而是使用每个 Kotlin 开发人员都应该知道的标准 ?: 运算符,这样更简洁。

但要回答你的问题:

fun main(args: Array<String>) {
    val k1: Long? = null
    val k2: Long? = 4L

    println(k1.default(0L)) // prints 0
    println(k2.default(0L)) // prints 4
}


fun <T> T?.default(default: T): T {
    return this ?: default
}

【讨论】:

  • 谢谢!我同意,可能不是正确的路线,但感谢您回答这个问题。我真的迷失在创建通用扩展方法上,但这对此有所帮助,所以我把这个问题留了下来。以后有人可能有更有用的需求哈哈
【解决方案2】:

你可以创建一个方法来做到这一点,它在下面,虽然我不明白你为什么想要一个方法呢?你基本上可以直接使用?:。它更具可读性和紧凑性。

扩展功能:

fun <T> T?.default(default: T): T {
    return this ?: default
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多