2012-06-29 33 views
5

Tôi đang gặp sự cố lạ với sự phản ánh trong Scala 2.10.0 Milestone 4 mà tôi không thể che giấu đầu mình. Đầu tiên cho những thứ mà làm việc theo cách mà tôi mong muốn:Gõ bình đẳng trong API phản xạ Scala 2.10

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> trait A[X]; trait B[Y] extends A[Y] 
defined trait A 
defined trait B 

scala> typeOf[B[String]].parents 
res0: List[reflect.runtime.universe.Type] = List(java.lang.Object, A[String]) 

scala> typeOf[B[String]].parents contains typeOf[A[String]] 
res1: Boolean = true 

Tương tự như vậy (trong cùng một phiên):

scala> trait D; trait E extends A[D] 
defined trait D 
defined trait E 

scala> typeOf[E].parents 
res2: List[reflect.runtime.universe.Type] = List(java.lang.Object, A[D]) 

scala> typeOf[E].parents contains typeOf[A[D]] 
res3: Boolean = true 

Không có bất ngờ ở đây: Tôi có thể yêu cầu cha mẹ của một loại và nhận được chính xác những gì Tôi mong đợi. Bây giờ tôi về cơ bản kết hợp hai ví dụ trên:

scala> trait F extends A[String] 
defined trait F 

scala> typeOf[F].parents 
res4: List[reflect.runtime.universe.Type] = List(java.lang.Object, A[String]) 

scala> typeOf[F].parents contains typeOf[A[String]] 
res5: Boolean = false 

Tôi không hiểu điều này có thể sai. Điều tương tự cũng xảy ra nếu tôi có F mở rộng A[Seq[D]], A[Int], v.v ... Khái niệm chung tôi thiếu là làm cho hành vi này có ý nghĩa gì?

+1

Tôi vừa xác nhận rằng điều này được khắc phục trong phiên bản 2.10.0-M5. –

Trả lời

6

Đó là lỗi. Ngay sáng nay tôi sẽ điều tra và sửa chữa nó.

Chỉnh sửa. điều này dường như là một chi tiết triển khai của API phản chiếu Scala bị rò rỉ cho userland. Nó không phải dễ dàng để sửa chữa, vì vậy bây giờ chúng tôi để nó như nó có, nhưng sẽ xem xét các khả năng để cải thiện.

Trong khi đó, để có kết quả chính xác, bạn phải luôn sử dụng =:= để so sánh các loại, chứ không phải ==.

3

Một minh họa về sự kì lạ:

scala> val atype = typeOf[A[String]] 
atype: reflect.runtime.universe.Type = A[String] 

scala> val atype2 = typeOf[F].parents(1) 
atype2: reflect.runtime.universe.Type = A[String] 

scala> typeOf[F].parents contains atype 
res39: Boolean = false 

scala> typeOf[F].parents contains atype2 
res40: Boolean = true 

Tôi nghĩ rằng bạn đang nhìn thấy một lỗi tương tự như sau một: https://issues.scala-lang.org/browse/SI-5959 (mặc dù tôi đã xác nhận rằng oddness này xảy ra bên ngoài của REPL quá).

+1

Quyền, điều này cũng xảy ra bên ngoài REPL. Cảm ơn báo cáo! –

+3

Bản cập nhật. Điều này thực sự là do hành vi không chính xác của typeOf: https://issues.scala-lang.org/browse/SI-6005. –