Young87

当前位置:首页 >个人收藏

scala中的classOf、isInstanceOf、asInstanceOf

scala中的classOf、isInstanceOf、asInstanceOf

Scala的三个预定义(predefined)方法,我们经常用到。

object PredefineTest{  
  def main(args: Array[String]): Unit = {  
    val c : Char = 97.asInstanceOf[Char]  
    "hello".asInstanceOf[String]  
    1.asInstanceOf[Long]  
    val it: Seq[String] = List("a", "b")  
    it.asInstanceOf[List[String]]  

    "hello".isInstanceOf[String]  

    classOf[String]  
    /*
    val c : Char = 97.asInstanceOf[Char]
    println("hello".asInstanceOf[String])
    println(1.asInstanceOf[Long])
    val it: Seq[String] = List("a", "b")
    println(it.asInstanceOf[List[String]])
    println("hello".isInstanceOf[String])
    println(classOf[String])
    hello
    1
    List(a, b)
    true
    class java.lang.String
    */
  }  
}  

使用scalac -Xprint:cleanup PredefineTest.scala,Scala编译器输出的main方法体内代码的抽象语法树(AST)信息如下:

val c: Char = 97.toChar();  
("hello": java.lang.String);  
1.toLong();  
val it: Seq = immutable.this.List.apply(scala.this.Predef.wrapRefArray(Array[java.lang.String]{"a", "b"}.$asInstanceOf[Array[java.lang.Object]]()));  
it.$asInstanceOf[List]();  
"hello".$isInstanceOf[java.lang.String]();  
{  
  classOf[java.lang.String];  
  ()  
}  

使用jd反编译工具查看对应代码如下:

char c = (char)97;  
"hello";  
1;  
Seq it = List..MODULE$.apply(Predef..MODULE$.wrapRefArray((Object[])new String[] { "a", "b" }));  
((List)it);  

("hello" instanceof String);  
String.class;  

classOf[T]

获取类型T的Class对象。

classOf方法定义在scala.Predef object:

object Predef extends LowPriorityImplicits {  
      /** Return the runtime representation of a class type.  This is a stub method.  
       *  The actual implementation is filled in by the compiler.  
       */  
      def classOf[T]: Class[T] = null  
    ...  
}

classOf的注释翻译过来的意思是:返回在运行过程中的类型。这是一个存根方法。具体的实现是由编译器填补(自动生成)。

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

isInstanceOf[T]

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

isInstanceOfasInstanceOf由scala.Any类定义,所以所有对象都自动拥有isInstanceOf和asInstanceOf这两个方法。

再看一下例子:

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的实例。这样的问题在模式匹配的时候也会遇到,关于如何克服类似的问题,可以参见

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 最受世界 500 强企业青睐的编程语言,竟是它们?

下一篇: Scala和Java中的Infinity和NaN

精华推荐