2012-12-11 10 views
9

Czy ktoś może wskazać mi, co powinienem robić pod scala 2.10 w miejsce tego nieużywanego świadka typu w Manifeście?Zastępowanie przestarzałego <: <świadka typu manifestu w Scali 2.10

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

Szczerze mówiąc, moim celem jest zastąpienie go czymś, co nie wywołuje ostrzeżenia o wycofaniu. Cieszę się, że mogę korzystać z nowego interfejsu API do odczytywania.

Oto kod na pytanie w kontekście, jeśli to ważne:

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

Odpowiedz

10

Jeśli chcesz tłumaczenie dość dosłowne manifestach aby wpisać tagi, trzeba uzyskać odpowiednie lustro, użyj go aby odzwierciedlić wystąpienie, a następnie użyj <:< na Type. Na przykład:

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] 
) 

A teraz:

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)) 

Nie mogą być sposoby można skorzystać z nowej Reflection API pełniej w aplikacji, ale to powinno działać i będzie dbać o amortyzację ostrzeżenia.

+0

Bardzo pomocna odpowiedź! Ale kiedy faktycznie próbuję tego w moim projekcie, otrzymuję następujący błąd środowiska wykonawczego: niedozwolone cykliczne odwołanie z udziałem klasy LineString (w scala.reflect.internal.Symbols $ TypeSymbol.tpe (Symbols.scala: 2710)) Oczywiście, to jest po prostu związane z konkretnymi klasami, o których mowa. –