我在之前的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我的,并且我从它延伸...
具有静态方法的类的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的类级别定义(除了Object像equals和的基本方法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)