scala中的classOf、isInstanceOf、asInstanceOf
日期: 2018-02-01 分类: 个人收藏 340次阅读
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类型的实例。
isInstanceOf
和asInstanceOf
由scala.Any类定义,所以所有对象都自动拥有isInstanceOf和asInstanceOf这两个方法。
再看一下例子:
scala> 1.isInstanceOf[String]
res0: false
scala> List(1).isInstanceOf[List[String]]
res0: true
由于Scala像Java一样泛型存在类型擦除的原因, 除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's BlogList(1).isInstanceOf[List[String]]
及相当于List(1).isInstanceOf[List[_]]
, List(1)是List的实例。这样的问题在模式匹配的时候也会遇到,关于如何克服类似的问题,可以参见
精华推荐