2014-06-19 58 views
1

我在以前的Java项目中使用的一个老技巧是创建例如一个FileUtils类,它为我的项目所需的常用文件操作提供了辅助函数,但不包含在例如org.apache.commons.io.FileUtils。因此,我的定制FileUtils将延伸org.apache.commons.io.FileUtils并提供其所有功能。扩展Java类的Scala对象

现在我尝试在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不是我的斯卡拉FileUtils的成员,但它是ApacheFileUtils,我从它延伸......

+4

我猜'readFileToString'是Java中的一个静态方法,所以它不会被继承扩展该类。 – Dylan

+0

的确,'readFileToString'是一个静态方法。 –

回答

5

斯卡拉等效采用静态方法一类是对象,所以在斯卡拉计算,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方法,如equalshashCode,你有没有)的类级别定义

你可能会发现,斯卡拉提供更优雅的方式来提供扩展。看看'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 
+0

更好的建议可能是'隐式类RichFile(...)扩展AnyVal'。我不确定人们说“皮条客我的自由”了;但我很确定他们从来没有说过“皮条客”。 :) –

+0

@ som-snytt'扩展AnyVal' +1。当你做隐式类时,你如何将隐式带入上下文中?我个人发现这个伴侣对象方法很干净,并且很明显。 “皮条客” - > :-) – maasg

+0

包对象是隐式类的理想选择。如果包裹是封闭的,你可以使用“package foo; package bar”来获取foo._,否则显式导入foo._。 –