2014-05-18 3 views
1

Scala 컴파일러가 아래 오류 메시지와 관련하여 어떤 것을 설명 할 수 있습니까?암시 적 매개 변수 및 ClassTag

object Some { 
    def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T = data 
} 
object Other { 
    def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T = 
    Some(data)(ordering.reverse) 
} 

컴파일러는 말한다 :

not enough arguments for method apply: (implicit evidence$2: scala.reflect.ClassTag[T], implicit ordering: Ordering[T])T in object Some. Unspecified value parameter ordering. 

내가 거기에 일부 내부 배열을 사용하기 위해, 객체 Some의 방법에 ClassTag을 추가 할 때 오류가 발생했다. 처음에는 코드이었다 (그리고 오류없이 컴파일) :

object Some { 
    def apply[T](data: T)(implicit ordering: Ordering[T]): T = data 
} 
object Other { 
    def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T = 
    Some(data)(ordering.reverse) 
} 

내가 ClassTag가 삭제를 극복 할 유형 정보와 암시 추가 알지만, 그건 내 주문 암시 적 매개 변수를 함께 할 수있다 이해하지 않거나 이유는 컴파일러가 갑자기 주문이 값이없는 생각 ...

답변

5

이 :

def apply[T](data: T)(implicit evidence: ClassTag[T], ordering: Ordering[T]): T = data 
:

def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T = data 

이에 대한 문법 설탕입니다

암시 적 매개 변수를 명시 적으로 지정할 때 두 매개 변수를 모두 제공해야합니다.

object Other { 
    def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T = 
    Some(data)(implicitly, ordering.reverse) 
} 
+0

그것은 매우 분명하지만 작은 실수를 가지고 : 당신은 암시 적 ClassTag을 통해 수행 할 implicitly를 사용할 수 있습니다. 우리는 암시 적으로 하나 이상의 매개 변수가 있으므로 암시 적으로 [ClassTag [T]]를 사용해야하며 우리가 원하는 것을 식별해야합니다. – cloud

+0

@cloud 아니요, 매개 변수는 순서에 따라 구별됩니다. 첫 번째 매개 변수는 ClassTag [T]이고 두 번째 매개 변수는 Ordering [T]입니다. 형식 매개 변수를 유추 할 수 있기 때문에 간단한 '암시 적으로'충분합니다. – wingedsubmariner

+0

젠장 타입 유추를 잊어 버렸습니다 ... 설명해 주셔서 감사합니다, 당신의 대답은 완벽합니다! – cloud

관련 문제