Kotlin基礎十一函數默認值
函數默認值
周所周知,Java語言並不支持參數使用默認值。有人說這是因爲“默認參數”和“方法重載”同時支持的話有二義性的問題,具體真正的原因我不得而知。但是對我個人來說,Java不支持這個特性的確挺讓我蛋疼的,雖然說使用方法重載也可以間接實現與默認參數這個特性相同的功能,但這就意味着你得寫更多的代碼……
關於這一點,有人說:
假設 Java 支持默認參數,則對於下面的代碼
public int add(int a) {
// do something
}
public int add(int a, int b = 0) {
// do something
}
當執行
add(12)
,你說是調用的int add(int a)
還是int add(int a, int b = 0)
?
對於這麼幹人的我不知道該說什麼好了,你既然定義了public int add(int a, int b = 0)
還定義public int add(int a)
幹什麼,不是多此一舉嗎。在C++裏面這麼幹會報錯,原因就是產生了二義性問題。就像我說的,定義了public int add(int a, int b = 0)
還定義public int add(int a)
幹什麼,多此一舉,換句話來說,這種問題是完全可以避免的,同時我們還能使用默認參數的特性和享受它的方便,不用再寫多餘的代碼。很高興,我們的Kotlin也支持這一特性:
@JvmOverloads //<1>
fun <T> joinToString(
collection: Collection<T>,
separator: String = ", ",
prefix: String = "",
postfix: String = ""
): String {
val result = StringBuilder(prefix)
for ((index, element) in collection.withIndex()) {
if (index > 0) result.append(separator)
result.append(element)
}
result.append(postfix)
return result.toString()
}
fun main(args: Array<String>) {
println(joinToString(listOf("c++", "Java","Python", "Kotlin")))
}
//result:
c++, Java, Python, Kotlin
Process finished with exit code 0
眼神犀利的同學們應該已經注意到了@JvmOverloads
這個聲明。那麼這是幹什麼用的呢?沒錯,剛纔我們不是說Java不支持默認參數嗎,這個聲明就是告訴Java編譯器編譯這個類時,生成對應的重載函數,這樣一來這個函數就可以在Java中使用了,不用我們自己再寫任何代碼:
public class DefaultPara {
//error public void print(String s = "1234")
public void print(String s) {
System.out.println(s);
}
public static void main(String ...args) {
new DefaultPara().print("dasdsa");
String[] str = {"c++", "Java","Python", "Kotlin"};
ArrayList<String> list = new ArrayList<>();
for (String s : str) {
list.add(s);
}
System.out.println(Kt34Kt.joinToString(list));
}
}
//result:
dasdsa
c++, Java, Python, Kotlin
Process finished with exit code 0
用過Python的同學可能還有疑問,既然支持默認參數,那支不支持指定參數傳值呢?答案是肯定的:
fun main(args: Array<String>) {
println(joinToString(listOf("c++", "Java","Python", "Kotlin"), postfix = "..."))
}
//result:
c++, Java, Python, Kotlin...
Process finished with exit code 0