2016-09-16 2 views
0

DoubleSeq을 허용 할 수있는 메서드를 구현하려고합니다. 이것은 Numeric을 사용하여 수행 할 수 있다고 들었지만, 스 플랫 책에서는 @specialized이라는 주석에 대해 읽었습니다. 스칼라에서 @specialized의 올바른 사용

그래서 나는 형의 힌트가 TString 생각하는 것 때문에

def getMedian[@specialized(Int, Double) T](s:Seq[T]):T = { 
    s.sorted match { 
    case y:Seq[T] if (y.length % 2 == 0) => y(0) + y(1)/2 
    } 
} 

그러나 스칼라가 + 동작을 인식하지 못하는 경우 다음과 같은 방법을 구현했습니다.

참고 : 방정식을 가독성을 위해 단순화했습니다. 더 이상 중앙값 계산을 나타내지 않습니다.

답변

3

간단하게 @specialized을 사용할 수 없습니다. @specialized이 제거되면 코드를 컴파일해야합니다. 주석은 컴파일러에게 T = IntT = Double에 대한 특수 버전을 생성하도록 알려줍니다. 따라서 여전히 Numeric이 필요합니다.

(SeqNumeric 전문이 아니기 때문에 지금까지 내가 이해,이 경우 @specialized 기본적으로 쓸모가 있습니다.)