scala 类型的判断和转换(isInstanceOf asinstanceof getClass classOf)

本文介绍了Scala中用于类型判断和转换的方法,包括isInstanceOf和asinstanceOf的使用,以及它们与getClass和classOf的区别。通过示例展示了如何判断对象是否属于特定类或其子类,以及如何进行类型转换。同时,讨论了getClass返回的Class对象的特性和classOf的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

isInstanceOf 和asinstanceOf

  • isInstanceOf用来判断对象是否为指定类或其子类的对象
  • asinstanceOf将对象转换为知道类型

java和scala写法对比

JavaScala
判断对象是否是C类型obj instanceof Cobj.isInstanceof[C]
将对象强转成C类型(C ) objobj.asInstanceof[C]
获取类型为T的class对象C.classclassOf[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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值