1.Kotlin默认导包
在kotlin中,我们可以在顶层函数或者类方法中随时随地的使用 let、with、also、apply等作用域方法,也可以随时调用 listOf、mutableListOf 等集合相关的方法,那么这些方法是从哪来的呢?原因就是每一个kotlin文件,都会默认导入很多包。根据官方文档,每一个kotlin文件都会默认导入以下包:
kotlin.*
kotlin.annotation.*
kotlin.collections.*
kotlin.comparisons.* (自 1.1 起)
kotlin.io.*
kotlin.ranges.*
kotlin.sequences.*
kotlin.text.*
//根据目标平台还会导入额外的包:
JVM:
java.lang.*
kotlin.jvm.*
JS:
kotlin.js.*
以 listOf 方法为例,点进去看源码:
package kotlin.collections
/**
* Returns a new read-only list of given elements. The returned list is serializable (JVM).
* @sample samples.collections.Collections.Lists.readOnlyList
*/
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
可以看到 listOf 方法是kotlin.collections包下的一个顶层方法,所以他被默认导入到了每一个kotlin文件,我们也就可以随时随地是用这个方法了。
2.kotlin“包空间”
在Java中一个文件必须对应一个类,kotlin弱化了文件的概念(与Java理念不同不适应), 同一个包下的所有kt文件,文件中的内容(除了private权限)其实都是在一个包空间内,同一个包下的kt文件之间的类、函数、变量(除了private权限)都是共享的。可以理解为同一个包下有着不同名字的kt文件,其实并没有什么意义,因为都是一个包空间下的,只是把代码按功能放在不同的文件写而已。