如何在Scala中正确使用asInstanceOf
我一直在玩基本的
Scala数据类型.我注意到scala.Any类定义了方法asInstanceOf [T0]:T0从
here API有它可以“将接收器对象转换为类型T0”.以此方法为起点,我想调查在Scala中的投射.此外,我查找了stackoverflow的其他问题,关于这个话题,我想出了
this
有了这个信息,我写了一个愚蠢的程序. package com.att.scala import com.att.scala.Sheltie object Casting { //def foo(x: String){ def foo(x: Int) { println("x is " + x) //if(x.isInstanceOf[String]) if(x.isInstanceOf[Int]) println("Int x is " + x) //println("String x is " + x) } def entry() { //val double: Any = 123.123 val double: Double = 123.23 val int = double.asInstanceOf[Int] //exception expected here //val str: String = "123" foo(int) } } 我的目标是了解在以下情况下会发生什么(以及为什么): >在第一种情况下,当我将程序作为 – com.att.scala.Casting.entry运行时,我运行了ClasscastException,如下所示.例外如下: java.lang.ClassCastException:java.lang.Double不能转换为java.lang.Integer 在这种情况下,代码应该产生一个ClasscastException,但它不会.那是我的担心 >在第三种情况下,我得到一个classcastexception: java.lang.ClassCastException:java.lang.String不能转换为java.lang.Integer 有了这个例子,我的目标就是在Scala的基础上进行投射.我知道这个例子不是一个真实世界的例子,但是我试图把头包裹在基础之上. 解决方法
Java(和Scala)允许您将一个原始double转换为int(在Scala的情况下,Double为Int).另一方面,您不能将java.lang.Double转换为java.lang.Int.
当您将Double声明为Any时,您明确要求编译器忘记您给予Double.因此,为了支持Any接口,编译器将该值作为boxed double存储(即java.lang.Double). 这个行为似乎令人困惑,但它并不是一个错误.根据Scala Language Spec的§12.1:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |