我想找到一种方法来在scala中的某个现有类中定义一个新方法.
例如,我认为该asInstanceOf[T]方法名称太长,我想用它替换它as[T].
直接的方法可以是:
class WrappedAny(val a: Any) {
def as[T] = a.asInstanceOf[T]
}
implicit def wrappingAny(a: Any): WrappedAny = new WrappedAny(a)
Run Code Online (Sandbox Code Playgroud)
有更少代码的更自然的方式吗?
此外,当我尝试这个时,会发生一件奇怪的事:
scala> class A
defined class A
scala> implicit def toA(x: Any): A = x
toA: (x: Any)A
scala> toA(1)
Run Code Online (Sandbox Code Playgroud)
控制台挂了.似乎不toA(Any)应该通过类型检查阶段,并且当它不是隐含时它不能.将所有代码放入外部源代码可能会产生同样的问题.这怎么发生的?这是编译器的错误(版本2.8.0)?
你的拉皮条方法在技术上没有任何问题Any,尽管我认为这通常是不明智的.同样,这是有原因的asInstanceOf,isInstanceOf并且如此详细地命名; 这是为了阻止你使用它们!几乎可以肯定,这是一种更好的,静态类型安全的方式来做任何你想做的事情.
关于导致控制台挂起的示例:声明的类型toA是Any => A,但是您已将其结果定义为x具有类型的结果,而Any不是A.这怎么可能编译?好吧,请记住,当出现明显的类型错误时,编译器会四处寻找任何可用的隐式转换来解决问题.在这种情况下,它需要一个隐式转换Any => A...并找到一个:toA!所以toA类型检查的原因是因为编译器隐式地将其重新定义为:
implicit def toA(x: Any): A = toA(x)
Run Code Online (Sandbox Code Playgroud)
...当你尝试使用它时,当然会导致无限递归.