open class A {
open fun foo(i: Int = 10) { /*……*/ }
}
class B : A() {
override fun foo(i: Int) { /*……*/ } // 不能有默认值
}
可变参数
fun <T> asList(vararg ts: T): List<T> {
val result = ArrayList<T>()
for (t in ts) // ts is an Array
result.add(t)
return result
}
asList(1, 2, 3)
// 或者使用伸展操作符,将数组展开
val a = arrayOf(1, 2, 3)
val list = asList(-1, 0, *a, 4)
函数的返回值
无返回值函数
// 无返回值函数可以使用 Unit 类型来表示,也可以省略返回值类型。
fun printHello() {
println("Hello")
}
fun printWorld(): Unit {
println("World")
}
单返回值函数
// 单个返回值函数可以使用任意类型来表示,如果没有显式指定返回值类型,则会根据函数体自动推断出返回值类型。
fun add(a: Int, b: Int): Int {
return a + b
}
fun sub(a: Int, b: Int) = a - b
fun dfs(graph: Graph) {
val visited = HashSet<Vertex>()
fun dfs(current: Vertex) {
if (!visited.add(current)) return
for (v in current.neighbors)
dfs(v)
}
dfs(graph.vertices[0])
}
匿名函数
val sum = fun(x: Int, y: Int): Int {
return x + y
}
val s = sum(1, 2)
println(s)
// list的map方法,就可以传入一个匿名函数
val list = listOf(1, 2, 3, 4, 5)
val newList = list.map(fun(i): Int { return i * 2 })
闭包
fun returnFun(): () -> Int {
var count = 0
return { count++ }
}
fun main() {
val function = returnFun()
val function2 = returnFun()
println(function()) // 0
println(function()) // 1
println(function()) // 2
println(function2()) // 0
println(function2()) // 1
println(function2()) // 2
}