4

次の点を考慮してください。

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> typeOf[Boolean]
res23: reflect.runtime.universe.Type = Boolean

scala> typeOf[scala.Boolean]
res24: reflect.runtime.universe.Type = Boolean

scala> res23 == res24
res25: Boolean = true

scala> typeOf[java.lang.Boolean]
res26: reflect.runtime.universe.Type = Boolean

scala> res23 == res26
res27: Boolean = false

scala> class Foo { def bf(arg: Boolean) = ??? }
defined class Foo

scala> typeOf[Foo]
res28: reflect.runtime.universe.Type = Foo

scala> res28.member(newTermName("bf")).asMethod
res30: reflect.runtime.universe.MethodSymbol = method bf

scala> res30.paramss.head.head
res31: reflect.runtime.universe.Symbol = value arg

scala> res31.typeSignature
res32: reflect.runtime.universe.Type = scala.Boolean

scala> res32 == res23
res33: Boolean = false

scala> res32 =:= res23
res37: Boolean = true

したがって、typeOf[Boolean] 関数を介して取得した型は、メソッドを検査して取得した型と同等ですが、等しくはありません。

結果が等しくなる正規表現に2つの同等の型を変換する方法はありますか? マップのキーなどに使えるようにしたいです。

編集:

より明確にするために、私が探しているのは次のようなものです(実際のreplセッションではありません):

scala>val tp1 = // some type
scala>val tp2 = // equivalent type obtained another way
scala>tp1 == tp2
res1: Boolean = false
scala>tp1 =:= tp2
res2: Boolean = true
scala>val ctp1 = tp1.canonical
scala>val ctp2 = tp2.canonical
scala>ctp1 == ctp2
res3: Boolean = true
scala>ctp1 =:= tp1
res4: Boolean = true
scala>ctp2 =:= tp2
res5: Boolean = true

したがって、等価性は変換によって保持されます。また、パラメーター化された型で動作する必要があります。

4

2 に答える 2

4

ドキュメントから:

==型の等価性を比較するために使用すべきではないことに注意することが重要=:=です。

もちろん、タイプをリストに保存し、(たとえば) 次を使用して、含まれているかどうかを確認できます。

myTypes.exists(_ =:= someType)

たとえば、このアプローチは 2.10 コンパイラ ソースで確認できます。もちろん、マップやセットほど効率的ではありませんが、通常、これらの多くはコレクションに含まれていません。

マップまたはセットのパフォーマンスが絶対に必要な場合は、要件に応じてerasure(別の回答が示唆するように) またはを使用できる場合があります。typeSymbol

于 2012-12-27T21:12:32.003 に答える
2

erasureの方法scala.reflect.api.Types.TypeApi

typeOf[Foo].member(newTermName("bf")).asMethod.paramss.head.head
  .typeSignature.erasure == typeOf[Boolean]
// res21: Boolean = true
于 2012-12-27T20:59:55.583 に答える