📅  最后修改于: 2023-12-03 15:05:02.930000             🧑  作者: Mango
在 Scala 中,可以使用 isInstanceOf
方法来判断一个对象是否属于某个类或其子类的实例。这个方法类似于 Java 中的 instanceOf
。
obj.isInstanceOf[ClassName]
其中 obj
是待检测的对象,ClassName
是需要判断的类名。
返回值为布尔型,如果 obj
是 ClassName
的实例,返回 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
在上面的例子中,我们定义了 Person
和 Student
两个类。Student
继承自 Person
。
我们创建了一个 Person
类型的对象 person
和一个 Student
类型的对象 student
。
使用 isInstanceOf
方法分别判断了 person
和 student
是否是 Person
和 Student
类型的实例。
输出结果与期望的结果一致。
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
类型的子类,符合类型匹配的规则。