2012-06-28 8 views
6

isInstanceOf विधि के साथ, कोई एक वस्तु के प्रकार की जांच कर सकता है। उदाहरण के लिए:सभी प्रकार के ऑब्जेक्ट को कैसे प्रदर्शित करें (स्कैला में)?

scala> val i: Int = 5 
i: Int = 5 

scala> val a: Any = i 
a: Any = 5 

scala> a.isInstanceOf[Any] 
res0: Boolean = true 

scala> a.isInstanceOf[Int] 
res1: Boolean = true 

scala> a.isInstanceOf[String] 
res2: Boolean = false 

कैसे एक एक वस्तु के सभी प्रकार प्रदर्शित कर सकते हैं (यदि यह बिल्कुल संभव है?)?

उत्तर

6

आप 2.10 (एम 4 या बाद में) में बहुत आसानी से कर सकते हैं:

import scala.reflect.runtime.universe._ 

def superTypes(t: Type): Set[Type] = 
    (t.parents ++ t.parents.flatMap(superTypes)).toSet 

def allTypes[A](a: A)(implicit tag: TypeTag[A]) = superTypes(tag.tpe) + tag.tpe 

कौन सा हमें निम्नलिखित देता है:

scala> allTypes(1).foreach(println) 
AnyVal 
Any 
NotNull 
Int 

scala> allTypes("1").foreach(println) 
String 
Any 
Object 
Comparable[String] 
CharSequence 
java.io.Serializable 

scala> allTypes(List("1")).foreach(println) 
scala.collection.LinearSeq[String] 
scala.collection.GenSeq[String] 
scala.collection.IterableLike[String,List[String]] 
scala.collection.GenIterable[String] 
scala.collection.GenTraversableLike[String,Iterable[String]] 
... 

आपको कुछ करने की कोशिश कर रहा एक बहुत कठिन समय होगा इस प्री-2.10 की तरह।

+0

धन्यवाद, 2.10 के साथ यह वास्तव में बहुत आसान लग रहा है। क्या आपको पता है कि सभी प्रकारों को प्री-2.10 में सूचीबद्ध करना संभव है? –

+0

[प्रकट] [http://www.scala-lang.org/api/current/scala/reflect/Manifest.html) वास्तव में इस तरह की चीज़ों का समर्थन करने के लिए डिज़ाइन नहीं किए गए हैं। सुपरक्लास, कार्यान्वित इंटरफेस इत्यादि प्राप्त करने के लिए आप [जावा रिफ्लेक्शन एपीआई] (http://docs.oracle.com/javase/tutorial/reflect/index.html) का उपयोग कर सकते हैं, लेकिन यह _types_ प्राप्त करने से बहुत अलग है। –

1

यहां एक और समाधान है, जो टाइप पैरामीटर को पुनः सत्यापित करने के लिए baseType विधि का उपयोग करता है।

import scala.reflect.runtime.universe._ 

def typesOf[T : TypeTag](v: T): List[Type] = 
    typeOf[T].baseClasses.map(typeOf[T].baseType) 

उदाहरण:

scala> typesOf("1") foreach println 
String 
CharSequence 
Comparable[String] 
java.io.Serializable 
Object 
Any 
+0

'बेस क्लासेस' आसान है, लेकिन वे _types_ नहीं हैं, बेशक, यही सवाल पूछा गया है। यह ध्यान देने योग्य भी है कि यह प्री-2.10 काम नहीं करेगा। –

+0

@TravisBrown प्रश्न सभी प्रकार के _display_ कहते हैं। 'बेस क्लास' रिटर्न किस प्रकार के लिए 'प्रतीक' हैं। आप उन सभी पर 'asTypeSymbol' को कॉल कर सकते हैं, या, ज़ाहिर है, '.asType' या' .typeSignature'। –

+0

लेकिन उदाहरण के लिए कहें कि आप 'सूची ("1")' के प्रकार चाहते हैं, जैसे कि आप जान सकें कि 'जेनसेक [स्ट्रिंग]' उनमें से एक है (बिना किसी कारण के 'isInstanceOf' का उपयोग किए बिना)। एक बार जब आप 'बेस क्लासेस' का उपयोग कर लेते हैं तो उस जानकारी को प्राप्त करने का कोई तरीका नहीं है-आप जो भी कर सकते हैं वह 'जेनसेक' के लिए प्रकार का प्रतीक प्राप्त होता है। –

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