Scala Apply方法在伴侣对象中

时间:2014-09-21 20:54:53

标签: scala

我已经为我的Scala类创建了一个伴随对象,其中包含一个apply方法,这样我就可以创建一个类的实例,而无需使用' new'。

object StanfordTokenizer{
  def apply() = new StanfordTokenizer()
}

class StanfordTokenizer() extends Tokenizer{


  def tokenizeFile(docFile: java.io.File) = new PTBTokenizer(new FileReader(docFile), new CoreLabelTokenFactory(), "").tokenize.map(x => x.word().toLowerCase).toList

  def tokenizeString(str: String) = new PTBTokenizer(new StringReader(str), new CoreLabelTokenFactory(), "").tokenize.map(x => x.word.toLowerCase()).toList

}

然而,当我试图在没有' new'的情况下实例化StanfordTokenizer类时例如StandfordTokenizer.tokenizeString(str)

我收到错误

value tokenizeString is not a member of object StanfordTokenizer

但是,如果我明确包含像StandfordTokenizer.apply().tokenizeString(str)这样的应用方法,它确实有效。

我觉得我遗漏了一些关于伴侣对象的基本信息。有人可以为我阐明这一点吗?                                  ^

1 个答案:

答案 0 :(得分:4)

正如编译器消息所说的那样。 tokenizeString是类StandfordTokenizer的成员,但不是其伴随对象。伴随对象不继承该类中的任何方法。因此,要使用tokenizeString,您需要StandfordTokenizer的实例才能调用它。

StandfordTokenizer.apply创建类StandfordTokenizer的实例,其方法为tokenizeString。似乎类StandfordTokenizer没有真正的信息,并且不会有多个实例。如果这是真的,你应该把它变成一个对象,并且你将能够获得你正在寻找的行为。

object StanfordTokenizer extends Tokenizer {

    def tokenizeFile(docFile: java.io.File) = ...

    def tokenizeString(str: String) = ...

}

这应该也可以(作为一个类):

StandfordTokenizer().tokenizeString(str)
没有括号的

StandfordTokenizer不会调用apply,它会引用该对象。 StandfordTokenizer()会调用apply,并创建该类的新实例。这可能是你困惑的根源。