Scala 提供了多种灵活的包导入方式。以下是主要的包导入语法:
1. 基本导入
// 导入单个类
import java.util.ArrayList
// 导入包中的所有成员
import java.util._
// 导入多个成员
import java.util.{List, Map, Set}
// 导入整个包(Scala 2.13+)
import java.util.*
2. 重命名导入
// 重命名导入的类
import java.util.{ArrayList => JList}
// 同时导入多个并重命名
import java.util.{Date => JDate, HashMap => JMap}
val list = new JList[String]() // 使用重命名后的名称
3. 排除导入
// 导入除特定类外的所有成员
import java.util.{Random => _, _}
// 这样 Random 类不会被导入,但其他都会
4. 相对导入和绝对导入
package com.example
// 相对导入(从当前包开始)
import utils.StringUtils
// 绝对导入
import com.example.utils.StringUtils
5. 导入对象中的成员
// 导入单例对象的方法
import scala.math.Pi
import scala.math.sqrt
// 导入所有方法
import scala.math._
println(Pi) // 直接使用,不需要 math.Pi
println(sqrt(16))
6. 隐式导入
Scala 自动导入以下包:
import java.lang._
import scala._
import scala.Predef._
7. 在代码块中局部导入
def calculateArea(radius: Double): Double = {
import scala.math._ // 只在方法内有效
PI * pow(radius, 2)
}
8. 实际示例
package com.example.app
import scala.collection.mutable.{ArrayBuffer, Map => MutableMap}
import scala.math.{Pi, pow}
import java.util.{Date, ArrayList => JList}
object ImportExamples {
def main(args: Array[String]): Unit = {
// 使用导入的类
val buffer = ArrayBuffer(1, 2, 3)
val mutableMap = MutableMap("a" -> 1)
val jlist = new JList[String]()
val now = new Date()
// 使用导入的数学常量和方法
val area = Pi * pow(5, 2)
println(s"Area: $area")
}
}
9. 最佳实践
// 清晰的导入分组
import java.io._
import java.net._
import scala.concurrent._
import scala.util._
// 避免通配符导入(在团队项目中)
import scala.collection.mutable.{ArrayBuffer, HashMap}
// 而不是:import scala.collection.mutable._
// 使用有意义的别名
import java.sql.{Date => SqlDate}
import java.util.{Date => UtilDate}
这些导入方式让 Scala 代码更加灵活和可读,特别是在处理名称冲突或需要组织大量导入时非常有用。