Kotlin 包和 import 语句使用

时间:2022-04-27
本文章向大家介绍Kotlin 包和 import 语句使用,主要内容包括Kotlin 包和 package 语句、import 语句、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

Kotlin 包和 package 语句

Kotlin 包与 Java 包的概念是一样的,都表示文件结构(语法上并不严格要求),可以起到区分同名源代码文件、组织项目结构的作用。

不过,由于允许包级函数和包级属性的存在,Kotlin 包的内容更加丰富,不像 Java 包只包含类和接口。

与 Java 源文件相同,Kotlin 源文件至多有一个 package 语句,必须放在第一行(除注解外),多个文件层次间使用点号分隔:

package foo.bar

此外,Kotlin 的 package 语句前可以有注解,这些注解不是针对 package 语句的,而是针对整个 Kotlin 源文件的,要在注解前加上 @file: 标识符。主要有两个: @kotlin.jvm.JvmName(val name: String): 这个注解可以用来修饰文件和函数,用来指定目标元素编译后的名称。对于一个 Kotlin 源文件来说 ,使用这个注解可以指定以 Kt 结尾的“文件类”的名称。 @kotlin.jvm.JvmMultiFileClass: 这个注解只能用来修饰文件,用来告诉 Kotlin 编译器:这个文件里定义的包级函数和包级属性,都只是一个 class 文件的一部分,这个 class 文件还有一部分定义在其他文件里。这个注释一般与上面的 JvmName 配合使用:

// kotlin.util.Synchronized.kt
@file:kotlin.jvm.JvmMultiFileClass
@file:kotlin.jvm.JvmName("StandardKt")
package kotlin
inline fun <R> synchronized(lock: Any, block: () -> R): R {/*...*/}

Synchronized.kt 文件用这两个注解表示这里的 synchronized() 函数应该包含在 StandardKt.class 文件里,这个 class 的另一部分在 Standard.kt 文件里。

import 语句

上面我们说到,Kotlin 包内的元素比 Java 包更为丰富,除类和接口外,还有函数和属性。因此 Kotlin 的 import 语句除了可以导入类和接口外,还可以导入包级函数和包级属性。

与 Java 相同,Kotlin 允许在 import 语句的最后用一个星号 * 来导入一个 Kotlin 或 Java 包内的所有元素。

Kotlin 不允许导入的元素重名,一旦出现重名,就需要用 as 自定义导入名称:

import foo.a.Bar
import foo.b.Bar as BBar

我们这里导入了两个不同包下的 Bar 类,如果不使用 as 重新定义导入名称,就会出现编译错误。这里我们将 foo.b.Bar 导入为 BBar,我们在这个文件里调用 foo.b.Bar 类时就要用 BBar 的名称,调用 foo.a.Bar 时仍然用 Bar 的名称。

包级函数和包级属性的导入使用 import 包名.函数名 / 属性名 的形式,并不需要写出文件名。

// test.Test.kt
fun sayHello() = println("Hello")
val a = 10

Kotlin 文件的导入方式如下:

import test.Test.sayHello
import test.Test.a

Java 文件的导入方式如下:

import test.TestKt;

TestKt.sayHello();
System.out.println(TestKt.a)

或者用 import static 静态导入:

import static test.TestKt.sayHello;
import static test.TestKy.a;

sayHello();
System.out.println(a);

需要注意,Kotlin 没有 Java 中的 import static 用法,如果需要导入一个 Java 类的静态方法,可以用 import Java 类.静态方法 的形式;如果导入一个 Kotlin 类在伴生对象里定义的静态方法,可以用 import Kotlin 类.Companion.静态方法 的形式:

// Test.kt
package test
class TestKotlin {
    companion object {
        fun printWorld() = println("World")
    }
}
// Test.java
package test;
public class TestJava {
    public static void printHello() {
        System.out.println("Hello");
    }
}

可以这样导入这两个静态方法:

import test.TestKotlin.Companion.printWorld
import test.TestJava.printHello

fun main(vararg args: String) {
  printHello()
  printWorld()
}

Kotlin 默认导入以下的包:

Kotlin 包

kotlin.、kotlin.annotation.、kotlin.collections.、kotlin.comparisons.、kotlin.io.、kotlin.ranges.、kotlin.sequences.、kotlin.text.

JVM 平台:

java.lang.、kotlin.jvm.

JavaScript 平台:

kotlin.js.*