加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala中正确使用asInstanceOf

发布时间:2020-12-16 21:34:14 所属栏目:安全 来源:网络整理
导读:我一直在玩基本的 Scala数据类型.我注意到scala.Any类定义了方法asInstanceOf [T0]:T0从 here API有它可以“将接收器对象转换为类型T0”.以此方法为起点,我想调查在Scala中的投射.此外,我查找了stackoverflow的其他问题,关于这个话题,我想出了 this 有了这
我一直在玩基本的 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) 
             }

         }

我的目标是了解在以下情况下会发生什么(以及为什么):
?1)从任何类型转换为Int.
??2)从Double型铸造到Int
??3)从String转换为Int

>在第一种情况下,当我将程序作为 – com.att.scala.Casting.entry运行时,我运行了ClasscastException,如下所示.例外如下:

java.lang.ClassCastException:java.lang.Double不能转换为java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source)
at com.att.scala.Casting $.entry(Casting.scala:17)
>在第二种情况下,我得到以下结果:
int是123
x是123
Int x为123

在这种情况下,代码应该产生一个ClasscastException,但它不会.那是我的担心

>在第三种情况下,我得到一个classcastexception:

java.lang.ClassCastException:java.lang.String不能转换为java.lang.Integer
????at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source)
????在com.att.scala.Casting $.entry(Casting.scala:20)

有了这个例子,我的目标就是在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:

The test x.asInstanceOf[T] is treated specially if T is a numeric value type (§12.2). In this case the cast will be translated to an application of a conversion method x.toT (§12.2.1).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读