扩展Java类的Scala对象

Sky*_*ker 1 scala

我在之前的Java项目中使用的一个老技巧是创建一个FileUtils类,它为我的项目所需的常见文件操作提供辅助函数,而不是由例如org.apache.commons.io.FileUtils.因此,我的习惯FileUtils将扩展org.apache.commons.io.FileUtils并提供其所有功能.

现在我尝试在Scala中做同样的事情,但是我的FileUtilsScala对象看不到apache帮助函数,这里有什么问题?

import org.apache.commons.io.{ FileUtils => ApacheFileUtils }

object FileUtils extends ApacheFileUtils {
   // ... additional helper methods
}

val content = FileUtils.readFileToString(new File("/tmp/whatever.txt"))
Run Code Online (Sandbox Code Playgroud)

编译器抱怨这readFileToString不是我的Scala的成员,FileUtils但它是ApacheFileUtils我的,并且我从它延伸...

maa*_*asg 5

具有静态方法的类的Scala等价物是一个对象,因此在Scala术语中,静态组件FileUtils被视为

object FileUtils {
  def readFile(s:String) = ???
  ...
}
Run Code Online (Sandbox Code Playgroud)

在Scala中,您无法扩展对象.这是非法的:

object A
object B extends A // A is not a type
Run Code Online (Sandbox Code Playgroud)

因此,object FileUtils extends ApacheFileUtils只允许您访问ApacheFileUtils的类级别定义(除了Objectequals和的基本方法hashCode,你没有)

您可能会发现Scala提供了更优雅的扩展方式.看看'pimp up my library'模式是一个很好的起点.

要将此模式应用于您的示例:

// definition of your "pimped" methods
import java.io.File

class RichFile(file:File) {
  def readToString():String = ???
}

// companion object defines implicit conversion 
object RichFile { 
  implicit def fileToRichFile(f:File):RichFile = new RichFile(f)
}
Run Code Online (Sandbox Code Playgroud)

//用法

import RichFile._

val content = new File("/tmp/whatever.txt").readToString
Run Code Online (Sandbox Code Playgroud)