isInstanceOf 和asinstanceOf
isInstanceOf
用来判断对象是否为指定类或其子类的对象asinstanceOf
将对象转换为知道类型
java和scala写法对比
Java | Scala | |
---|---|---|
判断对象是否是C类型 | obj instanceof C | obj.isInstanceof[C] |
将对象强转成C类型 | (C ) obj | obj.asInstanceof[C] |
获取类型为T的class对象 | C.class | classOf[C] |
示例
class Person
class Student extends Person
object Main4 {
def main(args: Array[String]): Unit = {
val s1:Person = new Student4
// 判断s1是否为Student类型
if(s1.isInstanceOf[Student4]) {
// 将s1转换为Student类型
val s2 = s1.asInstanceOf[Student]
println(s2)
}
}
}
getClass和classOf
isInstanceOf
只能判断出对象是否为指定类以及其子类的对象。getClass或classOf的组合可以精确的判断出对象是否是指定类的对象
getClass[A]
得到的是Class[A]的某个子类,但是可以用来判断是指定都系是否是指定类的对象。见《getClass和classOf的区别》classOf[A]
可以精确获取A- 再使用
==
操作符就可以直接比较出是否为指定类
示例
class Person
class Student extends Person
object Student{
def main(args: Array[String]) {
val p:Person=new Student
//判断p是否为Person类的实例
println(p.isInstanceOf[Person])//true
//判断p的类型是否为Person类
println(p.getClass == classOf[Person])//false
//判断p的类型是否为Student5类
println(p.getClass == classOf[Student])//true
}
}
getClass和classOf的区别
scala> class A
defined class A
scala> val a = new A
a: A = A@1d483de4
scala> a.getClass
res0: Class[_ <: A] = class A
scala> classOf[A]
res2: Class[A] = class A
scala> a.getClass ==classOf[A]
res3: Boolean = true
上面显示了两者的不同,getClass 方法得到的是 Class[A]的某个子类,而 classOf[A] 得到是正确的 Class[A],但是去比较的话,这两个类型是equals为true的
scala> val c:Class[A] = a.getClass
<console>:13: error: type mismatch;
found : Class[?0] where type ?0 <: A
required: Class[A]
Note: ?0 <: A, but Java-defined class Class is invariant in type T.
You may wish to investigate a wildcard type such as `_ <: A`. (SLS 3.2.10)
val c:Class[A] = a.getClass
^
scala> val c:Class[A] = classOf[A]
c: Class[A] = class A
在赋值时,可以明显的看出区别。java里的Class[T]不支持协变,所以无法把一个 Class[_ < : A] 赋值给一个 Class[A]