2012-12-11 8 views
9

Ai đó có thể chỉ cho tôi điều tôi nên làm theo scala 2.10 thay cho nhân chứng loại không được chấp nhận này trên Manifest?Thay thế không được chấp nhận <: <Chứng thực loại khai man trong Scala 2.10

reflect.ClassManifest.singleType(foo) <:< barManifest 

Thành thật mà nói, mục tiêu của tôi ở đây là thay thế bằng thứ gì đó không làm tăng cảnh báo không dùng nữa. Tôi rất vui khi sử dụng API phản chiếu mới.

Dưới đây là mã trong câu hỏi trong bối cảnh, nếu đó là quan trọng:

https://github.com/azavea/geotrellis/blob/master/src/main/scala/geotrellis/feature/op/geometry/geometry.scala#L45

Trả lời

10

Nếu bạn muốn có một bản dịch khá đen từ biểu hiện gõ thẻ, bạn sẽ cần phải nhận được gương thích hợp, sử dụng nó để phản ánh cá thể của bạn và sau đó sử dụng <:< trên Type. Ví dụ:

import scala.reflect.runtime.currentMirror 
import scala.reflect.runtime.universe._ 

sealed trait X 
case class Y(i: Int) extends X 
case class Z(j: String) extends X 

def filterX[A <: X: TypeTag](xs: List[X]) = xs.filter(
    x => currentMirror.reflect(x).symbol.toType <:< typeOf[A] 
) 

Và bây giờ:

scala> filterX[Z](List(Y(1), Y(2), Z("test"))) 
res1: List[X] = List(Z(test)) 

scala> filterX[Y](List(Y(1), Y(2), Z("test"))) 
res2: List[X] = List(Y(1), Y(2)) 

Có thể có nhiều cách bạn có thể tận dụng các API Reflection mới đầy đủ hơn trong ứng dụng của bạn, nhưng điều này sẽ làm việc và sẽ chăm sóc về việc không dùng cảnh báo.

+0

Câu trả lời rất hữu ích! Nhưng khi tôi thực sự cố gắng này trong dự án của tôi, tôi nhận được lỗi thời gian chạy sau đây: tham chiếu cyclic bất hợp pháp liên quan đến lớp LineString (tại scala.reflect.internal.Symbols $ TypeSymbol.tpe (Symbols.scala: 2710)) Tất nhiên, đó có lẽ chỉ là liên quan đến các lớp cụ thể được đề cập. –