扩展Java类的Scala对象

时间:2014-06-19 13:44:51

标签: scala

我之前在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并且我从它延伸......

1 个答案:

答案 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的类级别定义(除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)
}

//用法

import RichFile._

val content = new File("/tmp/whatever.txt").readToString