2014-09-21 5 views
0

'new'를 사용하지 않고 내 클래스의 인스턴스를 만들 수 있도록 내 스칼라 클래스의 companion 객체에 apply 메소드를 작성했습니다.스케이라는 컴패니언 객체에 메서드 적용

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). 내가 명시 적으로 작업을 수행 StandfordTokenizer.apply().tokenizeString(str) 같이 적용 방법을 포함하는 경우

나는,

value tokenizeString is not a member of object StanfordTokenizer 

그러나 오류가 발생합니다.

나는 동반자 개체에 대한 근본적인 것이 빠져있는 것처럼 느낍니다. 누군가 나를 위해 이것을 비추 줄 수 있습니까? ^

답변

4

정확히 컴파일러 메시지와 같습니다. tokenizeStringStandfordTokenizer 클래스의 멤버이지만 해당 객체는 포함하지 않습니다. 컴패니언 개체는 클래스의 메서드를 상속하지 않습니다. 따라서 tokenizeString을 사용하려면 StandfordTokenizer 인스턴스를 호출해야합니다.

StandfordTokenizer.applyStandfordTokenizer 클래스의 인스턴스를 만듭니다.이 인스턴스의 메서드는 tokenizeString입니다. StandfordTokenizer 클래스에는 실제 정보가없고 둘 이상의 인스턴스가없는 것처럼 보입니다. 그것이 사실이라면, 당신은 그것을 단지 객체로 만들어야하고, 당신이 찾고있는 행동을 얻을 수 있습니다. 이것은 (클래스로) 잘 작동한다

object StanfordTokenizer extends Tokenizer { 

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

    def tokenizeString(str: String) = ... 

} 

:

StandfordTokenizer().tokenizeString(str) 

StandfordTokenizerapply를 호출하지 않습니다 괄호없이, 그것은 객체를 참조합니다. StandfordTokenizer()apply을 호출하고 클래스의 새 인스턴스를 만듭니다. 이것은 아마도 혼란의 원인 일 것입니다.

관련 문제