我之前在Java项目中使用的一个老技巧是创建例如一个FileUtils
类,它为我的项目所需的常见文件操作提供了辅助函数,而不是由例如org.apache.commons.io.FileUtils
。因此,我的自定义FileUtils
会延长org.apache.commons.io.FileUtils
并提供其所有功能。
现在我尝试在Scala中执行相同操作但是通过我的FileUtils
Scala对象看不到apache帮助器函数,这里有什么问题?
import org.apache.commons.io.{ FileUtils => ApacheFileUtils }
object FileUtils extends ApacheFileUtils {
// ... additional helper methods
}
val content = FileUtils.readFileToString(new File("/tmp/whatever.txt"))
这里编译器抱怨readFileToString
不是我的Scala FileUtils
的成员,但它是ApacheFileUtils
并且我从它延伸......
答案 0 :(得分:5)
使用静态方法的类的Scala等价物是一个对象,因此在Scala术语中,FileUtils
的静态组件被视为
object FileUtils {
def readFile(s:String) = ???
...
}
在Scala中,您无法扩展对象。这是非法的:
object A
object B extends A // A is not a type
因此,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)
}
//用法
import RichFile._
val content = new File("/tmp/whatever.txt").readToString