2017-05-06 15 views
2

私が取り組んでいるプロジェクトでは、オプションがnullの場合、いくつかの型がデフォルト値を返すような拡張メソッドをいくつか書いています。Kotlinに汎用拡張メソッドを書き込む方法は?

は例えば、私は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 
} 

一般的にこれを行う方法があります場合、私は思ったんだけど、私は、私はすべてのタイプのために使用することができます1つの拡張メソッドを書くことができますか?

+2

ポイントは何ですか?直接 '?:'を使わないのはなぜですか?それは標準的でより簡潔です。 –

+0

....私は笑っていると思う本当の理由はありません。私がダウンし始めたのは個人的な好みのルートだった。 – AdamMc331

+1

'if'の'?.'が余分であることに注意してください。 – voddan

答えて

5

私はそれをしないで、すべての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 
} 
+1

ありがとう!私は同意する、おそらく正しいルートではなかったが、質問に答えるために感謝します。ジェネリック拡張メソッドを作成すると本当に失われましたが、これが役に立ったので、私は質問を残しています。将来誰かがもっと役に立つ必要があるかもしれない – AdamMc331

2

を?基本的には?:を直接使用することができます。より読みやすく、コンパクトです。

拡張機能:

fun <T> T?.default(default: T): T { 
    return this ?: default 
} 
関連する問題