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) …当你尝试使用它时,当然会导致无限递归. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angularjs – 非即时更新模型?
- 如何在shell脚本中的双管道后执行多个命令
- bootstrap之navs&pagination样式
- IBM Rational AppScan 7.8.0.2
- yum更换国内源、下载rpm包,源码包安装
- angularjs – 何时在茉莉花中使用间谍vs $httpBackend
- bash \u0026\u0026运算符阻止ssh上的背景
- vim – 将语法组添加到所有语法
- kendo-ui-angular2 – 用于Angular默认网格排序的Kendo
- angular2 – @HostBinding和@HostListening:他们做什么,他