generics - 如何在 Kotlin 中编写通用扩展方法?

标签 generics extension-methods kotlin

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

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

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
}

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

最佳答案

我不会那样做,而是使用每个 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
}

关于generics - 如何在 Kotlin 中编写通用扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43826438/

相关文章:

c# - 有没有办法得到 typeof Func<T, bool>?

c# - 使用 List<T> 参数构造 HashSet<T> 时是否允许重复?

.net - 如何使 CodeDom 生成的类实现自引用通用接口(interface)

c# - 扩展方法的空目标

c# - 通用约束——我不确定如何用非此即彼的情况解决这种情况

extension-methods - 具有扩展方法的reshaper智能感知问题

c# - 从 Expression<Func<TModel, TProperty>> 转换为 Expression<Func<TModel, bool>>

kotlin - 带前缀星号是什么意思

kotlin - 撰写 : placement of measurables in Layout based on measuredWidth

Kotlin ;按多个字段分组