2013-02-05 1 views
3

여기에 기본 예제가 있습니다. 저는 기존 클래스를 통해 또는 여러 매개 변수를 사용하여 2 가지 방법으로 클래스를 초기화하는 기능을 원한다는 것을 알기 위해 스칼라를 얻을 수 없습니다.스칼라에 다중 매개 변수 또는 시퀀스가있는 생성자?

I 수신 오류 :

이중 정의 : 방법이 적용 (PARAMS : 지능 *) chorle.scala.tests.MultiParam 및 방법이 적용 (PLIST를 :
서열 [지능]) 9 번째 줄에서 chorle.scala.tests.MultiParam는 삭제 한 후 같은 유형이 있습니다 (PARAMS 서열) chorle.scala.tests.MultiParam

좋아, 내가 여기에 무슨 일이 일어나고 있는지 얻을 - 두 기능의 원인이 후 컴파일 동일한 헤더 서명에서. 그러나 실제로는 같은 방식으로 작동하지 않습니다. 나는 envoke 할 수 없습니다. apply (Seq) 버전 만있는 경우 apply (1,2,3) ... apply (seq)를 적용 할 수 없습니다. 다른 방법으로. 나는 실제 함수 호출을 패치 할 수있는 여러 가지 방법을 알고 있지만이 문제를 클래스에서 한 번만 올바르게 해결하려면 어떻게해야합니까? 고맙습니다!

class MultiParam protected (pList:Seq[Int]) 

object MultiParam { 
    def apply(pList:Seq[Int]): MultiParam = new MultiParam(pList) 
    def apply(params: Int *): MultiParam = new MultiParam(params) 


} 

답변

4

두 가지 방법을 모두 생성 할 수있는 방법이 없기 때문에 그대로 사용할 수 없습니다. 주위 유일한 방법은 그들을 명확하게하는 것입니다

object MultiParam { 
    def apply(pList:Seq[Int]): MultiParam = new MultiParam(pList) 
    def apply(param: Int, params: Int *): MultiParam = new MultiParam(param +: params) 
    def apply(): MultiParam = new MultiParam(Nil) 
} 
5

문제는 소위 "반복 PARAMS"형태는 문법 설탕이 정의 사이트와 특별한 종류의 호출 사이트에서 모두 사실에서 온다 IndexedSeq인데, 이는 모호함을 초래합니다. REPL에서

package rrs.scribble 

object MP { 
    class MultiParam protected (pList:Seq[Int]) { 
    override def toString: String = pList.mkString("[[", ", ", "]]") 
    } 

    object MultiParam { 
    def apply(): MultiParam = new MP.MultiParam(List.empty[Int]) 
    def apply(ints: Seq[Int]): MultiParam = new MP.MultiParam(ints) 
    def apply(i1: Int, iMore: Int*): MultiParam = new MP.MultiParam(i1 +: iMore) 
    } 
} 

:

당신이 표준 컬렉션 라이브러리의 여러 곳에서 찾을 수있는이, 처리하는 주식이다 방법은 물론,

scala> MultiParam() 
res0: rrs.scribble.MP.MultiParam = [[]] 

scala> MultiParam(12) 
res3: rrs.scribble.MP.MultiParam = [[12]] 

scala> MultiParam(12, 34) 
res4: rrs.scribble.MP.MultiParam = [[12, 34]] 

scala> MultiParam(12, 34, 56) 
res5: rrs.scribble.MP.MultiParam = [[12, 34, 56]] 
+0

와, 내가 간과 0 인수 케이스! –