2017-05-06 59 views
2

在一个项目中我的工作,我发现自己写一些推广方法对于某些类型的返回默认值,如果一个可选的为空。如何在Kotlin中编写通用扩展方法?

例如,我可能有一个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 
} 

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

+2

有什么意义?为什么不直接使用'?:'?它既标准又简洁。 –

+0

....我没有真正的理由我猜大声笑。这只是我开始走下坡路的个人偏好路线。 – AdamMc331

+1

请注意,'的'if'?.'是多余的 – voddan

回答

5

我不会那么做的,并使用标准?:运营商,每一个开发商科特林应该知道,这是更简洁。

但是,为了回答你的问题:

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 
} 
+1

谢谢!我同意,可能不是正确的路线,但谢谢你回答这个问题。我在创建一个通用的扩展方法方面真的很失落,但是这有助于解决这个问题,所以我将这个问题留下了。有人可能在未来有更多有用的需求哈哈 – AdamMc331

2

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

扩展功能:

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