2012-12-11 15 views
9

में मैनिफेस्ट प्रकार गवाह मुझे किसी को बता सकता है कि मुझे स्केल 2.10 के तहत मेनिफेस्ट पर इस बहिष्कृत प्रकार के गवाह के स्थान पर क्या करना चाहिए?बहिष्कृत स्थानांतरित करना <: <स्काला 2.10

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

ईमानदारी से, मेरा लक्ष्य यहां कुछ ऐसी जगह से प्रतिस्थापित करना है जो बहिष्करण चेतावनी नहीं उठाता है। मुझे नए प्रतिबिंब एपीआई का उपयोग करने में खुशी है।

यहाँ, संदर्भ में सवाल में कोड है कि यदि महत्वपूर्ण है:

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

उत्तर

10

आप टैग टाइप करने के लिए प्रकट होता है से एक काफी शाब्दिक अनुवाद चाहते हैं, आप इसका इस्तेमाल, उचित दर्पण दिखाने के लिए आवश्यक अपने उदाहरण को प्रतिबिंबित करने के लिए, और Type पर उपयोग करें।

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

और अब: उदाहरण के लिए:

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

कई तरीकों से अपने आवेदन में अधिक पूरी तरह से नया प्रतिबिंब एपीआई का लाभ ले सकता है हो सकता है, लेकिन यह काम करना चाहिए और निंदा का ख्याल रखेंगे चेतावनी।

+0

बहुत उपयोगी उत्तर! लेकिन जब मैं वास्तव में अपने प्रोजेक्ट में इसका प्रयास करता हूं, तो मुझे निम्न रनटाइम त्रुटि मिलती है: क्लास लाइनस्ट्रिंग (scala.reflect.internal.Symbols $ TypeSymbol.tpe (Symbols.scala: 2710) पर अवैध चक्रवात संदर्भ शामिल है) बेशक, यह शायद प्रश्न में विशिष्ट वर्ग से संबंधित है। –

संबंधित मुद्दे