에서 재귀 유형에 실패 I 다음 예제 코드가 있습니다스칼라 패턴 매칭은 2.10
이 코드는 컴파일 및 2.9.x에서 제대로 실행trait Recurse[T <: Recurse[T]] {
def method = "This is a method on recurse"
}
class Foo extends Recurse[Foo] {
override def toString = "This is a foo"
}
object Example {
def generate: Recurse[_ /*<: Recurse[_]*/] = new Foo()
def main(args: Array[String]) {
val foo = generate
foo match {
case m: Foo => println("match: " + m)
case _ => println("baa")
}
println(foo.method)
}
}
(출력 "경기 :이 foo는이다" "이 다음을 재발에 관한 방법입니다. "), 2.10.2에서는 작동하지 않습니다. 대신 컴파일 타임 오류가 발생합니다. 형식 인수 [_ $ 1]이 특성을 따르지 않습니다. Recurse의 형식 매개 변수 범위 [T < : Recurse [T]]
흥미로운 점은이 문제는 패턴 매칭 기. 일치 항목을 제거하면 코드가 컴파일되고 코드는 "이것은 재귀 방식입니다"라고 출력합니다.
더욱 흥미로운 점은 패턴 일치가 기본 케이스 인 경우에도 컴파일이 실패한다는 것입니다. 컴파일러는 패턴 매치를위한 재귀 적 실존 유형을 가진 객체를 받아들이지 않습니다. 그러나 foo의 값이 명시 적으로 지정된 경우 ("val foo = new Foo()") 또는 type 매개 변수가 재귀가 아닌 경우 2.10에서도 코드가 컴파일됩니다.
여기에 무슨 일이 일어나고 있습니까? type 매개 변수가 어떤 식 으로든 일치와 관련되지 않은 경우에도 패턴 일치가 중단되는 이유는 무엇입니까? 2.10과 호환되는 방식으로 이것을 다시 쓸 수있는 방법이 있습니까?