美文网首页The Sca...
classOf、isInstanceOf、asInstanceO

classOf、isInstanceOf、asInstanceO

作者: 雨笋情缘 | 来源:发表于2018-12-18 17:30 被阅读1次

1 、classOf[T]

 获取类型T的Class对象

 classOf方法定义在scala.Predef object:

object Predef extends LowPriorityImplicits {                def classOf[T]: Class[T] = null      ...  

classOf的注释翻译过来的意思是:返回类型的运行时呈现状态。这是一个存根方法。实际的实现是由编译器填补(自动生成)

Predef object是默认导入的,所以classOf方法相当于一个全局方法。 

2、isInstanceOf[T]

     判断对象是否为T类型的实例。

        isInstanceOf和asInstanceOf 由scala.Any类定义,Scala类层级的根类;其中class scala.AnyRef 继承自Any,是所有应引用类型的基类;trait scala.AnyVal 也继承自Any,是所有基本类型的实现的trait。所以所有对象都自动拥有isInstanceOf和asInstanceOf这两个方法。

      特别注意的是Any 和AnyRef 这两个类属于“编译时类型”(虚拟类型?),不存在于运行时。所以这两者在Scala中都未提供源码,其语义由编译器在编译时构建。

scala> 1.isInstanceOf[String]  res0: false   

scala> List(1).isInstanceOf[List[String]]  res0: true  

        由于Scala像Java一样泛型存在类型擦除的原因,List(1).isInstanceOf[List[String]]及相当于List(1).isInstanceOf[List[_]], List(1) 是List的实例.

3、asInstanceOf[T]

        将对象类型强制转换为T类型。

         还是由于泛型存在类型擦除的原因,1.asInstanceOf[String]在运行时会抛出ClassCastException异常,而List(1).asInstanceOf[List[String]]将不会

4、 结论

        总而言之,我们把classOf[T]看成Java里的T.class, obj.isInstanceOf[T]看成 obj instanceof T, obj.asInstanceOf[T]看成(T)obj就对了。scala为我们提供了语法糖,但也免不了类型擦除问题的影响。

【转】http://blog.sina.com.cn/s/blog_7d553bb50102wa7h.html

相关文章

网友评论

    本文标题:classOf、isInstanceOf、asInstanceO

    本文链接:https://www.haomeiwen.com/subject/mbblkqtx.html