2014-09-21 77 views
0

我已經爲我的Scala類創建了一個伴侶對象,其中有一個apply方法,這樣我就可以在不使用'new'的情況下創建我的類的一個實例。Scala在伴侶對象中的應用方法

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 

} 

但是,當我試圖實例化StanfordTokenizer類沒有'新'例如StandfordTokenizer.tokenizeString(str)

我得到的錯誤

value tokenizeString is not a member of object StanfordTokenizer 

但是,如果我明確地包括應用方法類似StandfordTokenizer.apply().tokenizeString(str)它的工作。

我覺得我缺少一些關於伴侶對象的基礎知識。有人能幫我解釋一下嗎? ^

回答

4

正如編譯器消息所述。 tokenizeStringStandfordTokenizer類的成員,但不是其伴侶對象。伴隨對象不會繼承類中的任何方法。因此,爲了使用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,並創建該類的新實例。這可能是你混亂的根源。

相關問題