由于scala.runtime.RichString被声明为final,因此您不能像class MyString extends RichString
那样扩展它。我想“拉皮条的图书馆”,只是添加另一种方法。我该怎么做?
最佳答案
由于隐式的一个关键规则是,只有一个应用过,才能进行给定的(子)表达式类型检查,因此将RichString
插拔为依次添加到它添加到String
的方法的补充将是不允许的您可以看到RicherString
类的方法(如果可以),就好像直接在String实例上可用。当然,如果您有RichString
,它们将可用,并且RichString
实例可以通过简单类型归属从String
实例中轻松获得。但是,这并不是任何人都可以称之为方便的地方。
因此,出于实际目的,您所要求的实际上在Scala中是不可能的。
另一方面,如果只需要String
的替代扩充,则可以定义自己的扩充字符串类。如果它定义的方法与RichString中定义的方法之间没有重叠,则编译器在决定应用哪个方法时将不会有任何歧义。那可能已经足够好了吧?
此外,当您切换到使用StringOps
代替RichString
的Scala 2.8时,这种方法(另一种非重叠的隐式转换)不会中断。
为此,您将执行以下类似操作:
class MyRichString(underlying:String){
def myNewMethod = { ... }
}
implicit def addMyMethods(s:String)=new MyRichString(s)