我已经为我的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)
这样的应用方法,它确实有效。
我觉得我遗漏了一些关于伴侣对象的基本信息。有人可以为我阐明这一点吗? ^
答案 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
,并创建该类的新实例。这可能是你困惑的根源。