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

scala – 将方法注入现有类

发布时间:2020-12-16 10:07:19 所属栏目:安全 来源:网络整理
导读:我想找到一种方法来在 scala中的某个现有类中定义一个新方法. 例如,我认为asInstanceOf [T]方法名称太长,我想用[T]替换它. 直接的方法可以是: class WrappedAny(val a: Any) { def as[T] = a.asInstanceOf[T]}implicit def wrappingAny(a: Any): WrappedAny
我想找到一种方法来在 scala中的某个现有类中定义一个新方法.

例如,我认为asInstanceOf [T]方法名称太长,我想用[T]替换它.

直接的方法可以是:

class WrappedAny(val a: Any) {
  def as[T] = a.asInstanceOf[T]
}

implicit def wrappingAny(a: Any): WrappedAny = new WrappedAny(a)

有更少代码的更自然的方式吗?

此外,当我尝试这个时,会发生一件奇怪的事:

scala> class A

defined class A

scala> implicit def toA(x: Any): A = x

toA: (x: Any)A

scala> toA(1)

控制台挂了.似乎toA(Any)不应该通过类型检查阶段,并且当它不是隐式时它不能.将所有代码放入外部源代码可能会产生同样的问题.这怎么发生的?这是编译器的错误(版本2.8.0)?

解决方法

你的拉皮条方法没有任何技术上的错误任何,虽然我认为这通常是不明智的.同样,有一个原因asInstanceOf和isInstanceOf被如此详细地命名;这是为了阻止你使用它们!几乎可以肯定,这是一种更好的,静态类型安全的方式来做任何你想做的事情.

关于导致控制台挂起的示例:toA的声明类型是Any => A,但你已经将它的结果定义为x,它的类型为Any,而不是A.这怎么可能编译?好吧,请记住,当出现明显的类型错误时,编译器会四处寻找任何可用的隐式转换来解决问题.在这种情况下,它需要隐式转换Any => A ……找到一个:toA!所以进行类型检查的原因是因为编译器隐式地将其重新定义为:

implicit def toA(x: Any): A = toA(x)

…当你尝试使用它时,当然会导致无限递归.

(编辑:李大同)

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

    推荐文章
      热点阅读