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

Scala短和类型安全的演员运算符

发布时间:2020-12-16 08:57:36 所属栏目:安全 来源:网络整理
导读:我不喜欢 Scala isInstanceOf和asInstanceOf方法 – 它们很长并且asInstanceOf可以抛出异常所以我们需要在几个中使用它.更好的方法是使用模式匹配: Scala: How do I cast a variable?,但对于非常简单的操作,它也可能相对较长.在C#中,我们有’is’和’as’运
我不喜欢 Scala isInstanceOf和asInstanceOf方法 – 它们很长并且asInstanceOf可以抛出异常所以我们需要在几个中使用它.更好的方法是使用模式匹配: Scala: How do I cast a variable?,但对于非常简单的操作,它也可能相对较长.在C#中,我们有’is’和’as’运算符,所以我想在Scala中实现隐式定义.我的代码看起来像这样:

scala> class TypeCast(x:Any){
     | def is[T](t:Class[T]) = t.isInstance(x) 
     | def as[T](t:Class[T]):Option[T] = if(t.isInstance(x)) Option(t.cast(x)) else None
     | }
defined class TypeCast

scala> implicit def TypeCastID(x:Any)=new TypeCast(x)
TypeCastID: (x: Any)TypeCast

scala>  123 as classOf[String]
res14: Option[String] = None

scala> "asd" as classOf[String]
res15: Option[String] = Some(asd)

它有一个优点 – 实现null-object模式但也有缺点:

>需要使用classOf [T]运算符 – 它太长了
>开销与隐式def连接,用于这种简单的操作

所以没有实际的理由使用它.
我想知道有没有办法实现这个而不需要使用classOf [T]?

解决方法

那么你可以在你在TypeCast类中制作的def中缩短它.所以,不要给它一个参数,你可以只依靠类型.这会使它缩短很多.作为一个例子,这可能看起来像:

class TypeCast(x : Any) {
    def is[T : Manifest] = manifest.erasure.isInstance(x)
    def as[T : Manifest] : Option[T] = if (manifest.erasure.isInstance(x)) Some(x.asInstanceOf[T]) else None
}

未来的电话可能如下:

scala> 123.as[String]
res0: Option[String] = Some(123)
scala> class A; class B extends A
defined class A
defined class B
scala> new B
res1: B
scala> res1.is[Int]
res2: Boolean = false
scala> res1.as[Int]
res3: Option[Int] = None

更新:我添加了清单以避免类型检查错误

(编辑:李大同)

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

    推荐文章
      热点阅读