2014-09-21 7 views
0

J'ai créé un objet compagnon pour ma classe Scala avec une méthode apply afin que je puisse créer une instance de ma classe sans utiliser 'new'. Cependant, lorsque j'essaie d'instancier la classe StanfordTokenizer sans 'new', par exemple, quand je tente d'instancier la classe StanfordTokenizer. StandfordTokenizer.tokenizeString(str).Scala Apply, méthode dans l'objet compagnon

Je reçois l'erreur

value tokenizeString is not a member of object StanfordTokenizer 

Cependant, si j'inclure explicitement la méthode apply comme StandfordTokenizer.apply().tokenizeString(str) il fonctionne. J'ai l'impression qu'il me manque quelque chose de fondamental sur les objets compagnons. Quelqu'un peut-il éclairer cela pour moi? ^

Répondre

4

C'est exactement ce que dit le message du compilateur. tokenizeString est un membre de la classe StandfordTokenizer, mais pas son objet compagnon. L'objet compagnon n'hérite d'aucune méthode de la classe. Par conséquent, afin d'utiliser tokenizeString, vous avez besoin d'une instance de StandfordTokenizer pour l'appeler.

StandfordTokenizer.apply crée une instance de la classe StandfordTokenizer, qui a la méthode tokenizeString. Il semble que la classe StandfordTokenizer ne contient aucune information réelle et n'aura pas plus d'une instance. Si cela est vrai, vous devriez probablement en faire un objet, et vous pourrez acquérir le comportement que vous recherchez.

object StanfordTokenizer extends Tokenizer { 

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

    def tokenizeString(str: String) = ... 

} 

Cela devrait fonctionner aussi bien (en classe):

StandfordTokenizer().tokenizeString(str) 

StandfordTokenizer sans parenthèses ne remet pas apply, il fait référence à l'objet. StandfordTokenizer() appelle apply et crée une nouvelle instance de la classe. C'est probablement la source de votre confusion.

Questions connexes