由于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)

09-12 20:50