2017-05-06 42 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 
}