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

どのようにしてすべてのタイプのオブジェクトを表示できますか(可能であれば)?

4

2 に答える 2

6

これは、2.10(M4以降)では非常に簡単に実行できます。

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より前のようなことをしようとすると、はるかに困難になります。

于 2012-06-28T16:53:30.237 に答える
1

baseTypeこのメソッドを使用してtypeパラメーターを具体化する別のソリューションを次に示します。

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
于 2012-06-28T19:02:30.883 に答える