implicits를 찾을 때, Scala 컴파일러는 다른 곳에서 관련된 클래스의 다양한 부분의 부속 객체를 찾습니다. 그러나 암시 적 변환이 클래스 자체에서 사용되는 경우이 객체가 컴패니언 객체보다 먼저 정의 된 경우에는이 조회를 수행하지 못합니다. 내가 요리 할 수 있었다 최소한의 예는 다음과 같습니다스칼라에서 정의 문제의 순서?
trait Counter[A] {
def count(a: A): Int
}
object Foo {
def foo[A](a: A)(implicit c: Counter[A]) = c.count(a)
}
case class Bar(id: Int) {
import Foo._
def count = foo(this)
}
object Bar {
implicit object BarCounter extends Counter[Bar] {
def count(b: Bar) = b.id
}
}
이것은 could not find implicit value for parameter c: Counter[Bar]
말을 컴파일에 실패 - 나는 스칼라 2.9.1을 사용하고 있습니다.
재미있는 점은 (rjsvaljean에서 제안한) 우리가 순서를 바꾸면 object Bar
을 case class Bar
앞에 정의한다는 것입니다.
이 오류는 컴파일러 버그입니까? 아니면 스칼라의 범위 규칙에 대해 뭔가 빠졌습니까?
또한이 문제는 암시 적 해결에서만 발생한다고 언급해야합니다. 우리가 명시 적으로 BarCounter
객체를 전달하면 모든 것이 잘 컴파일됩니다.
이유는 모르지만'object Foo'와'case class Foo'의 순서를 바꾸면 컴파일 오류가 발생하지 않습니다. – rjsvaljean
@rjsvaljean 이상한 - 컴파일러 결함과 같은 lloks. 내가 그것을 받아 들일 수 있도록 응답으로 추가 하시겠습니까? – Andrea
잘 모르겠습니다. 해당 데이터를 포함하여 질문을 편집하고 그것을 수정하는 대신 컴파일에 실패한 이유를 설명하는 응답을 기다리는 것이 더 유용하지 않습니까? 어쩌면이 질문을 완전히 일반화하고 다시 게시하기 위해 변경하십시오. – rjsvaljean