📜  scala isInstanceOf - Scala (1)

📅  最后修改于: 2023-12-03 15:05:02.930000             🧑  作者: Mango

Scala 的 isInstanceOf 方法

在 Scala 中,可以使用 isInstanceOf 方法来判断一个对象是否属于某个类或其子类的实例。这个方法类似于 Java 中的 instanceOf

语法
obj.isInstanceOf[ClassName]

其中 obj 是待检测的对象,ClassName 是需要判断的类名。

返回值为布尔型,如果 objClassName 的实例,返回 true;否则返回 false

示例
class Person(val name: String)

class Student(name: String) extends Person(name)

val person = new Person("Tom")
val student = new Student("Jerry")

println(person.isInstanceOf[Person])  // true
println(person.isInstanceOf[Student]) // false
println(student.isInstanceOf[Person]) // true
println(student.isInstanceOf[Student])// true

在上面的例子中,我们定义了 PersonStudent 两个类。Student 继承自 Person

我们创建了一个 Person 类型的对象 person 和一个 Student 类型的对象 student

使用 isInstanceOf 方法分别判断了 personstudent 是否是 PersonStudent 类型的实例。

输出结果与期望的结果一致。

应用场景

isInstanceOf 方法可以用于类型的判断。比如在函数参数中需要传入某个指定类型的对象时,可以使用该方法进行校验。

def printPersonName(person: Person): Unit = {
  if (person.isInstanceOf[Person]) {
    println(person.name)
  } else {
    throw new IllegalArgumentException("person 参数类型错误")
  }
}

val person = new Person("Tom")
val student = new Student("Jerry")

printPersonName(person)  // Tom
printPersonName(student) // IllegalArgumentException: person 参数类型错误

当传入 Person 类型的对象时,可以正常输出;当传入 Student 类型的对象时,抛出异常,提示参数类型错误。

注意事项

isInstanceOf 方法判断的是对象的类型,而不是变量的类型。如果变量的类型是超类类型,但是实例对象是子类类型,那么也会返回 true

val person: Person = new Student("Jerry")

println(person.isInstanceOf[Person]) // true
println(person.isInstanceOf[Student])// true

在上面的例子中,我们定义了变量 person,类型是 Person,但实例对象是 Student 类型的对象。

使用 isInstanceOf 方法判断 person 是否是 Person 类型的实例和 Student 类型的实例,结果都是 true

这是因为虽然变量 person 的类型是 Person,但实例对象是 Student 类型,因此也是 Person 类型的子类,符合类型匹配的规则。