通过isInstanceOf检查scala中的结构类型

时间:2014-06-10 03:54:22

标签: scala type-systems structural-typing

我只是检查scala中的结构类型相等。

我立即从匿名类创建foo实例,并Q类型。 我打算让它们与方法名称不同,以便希望它们在结构上被视为不同的类型。

代码段:

scala> val foo = new {def foo=1}
a: AnyRef{def foo: Int} = $anon$1@3885c37f

scala> type Q = {def q:Unit}
defined type alias Q

scala> foo.isInstanceOf[Q]
<console>:14: warning: a pattern match on a refinement type is unchecked
              foo.isInstanceOf[Q]
                            ^
res55: Boolean = true

检查返回true。

Q1: 我不明白为什么fooQ的实例。 那是胡说八道。它们在类型结构方面不同吗?

Q2: 那么检查结构类型的正式方法是什么?

1 个答案:

答案 0 :(得分:1)

isInstanceOf根据班级信息。在您的情况下,您需要输入信息:

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

scala> val foo = new {def foo=1}
foo: AnyRef{def foo: Int} = $anon$1@15ab47

scala> type Q = {def q:Unit}
defined type alias Q

scala> def getType[T : TypeTag](t: T) = implicitly[TypeTag[T]].tpe
getType: [T](t: T)(implicit evidence$1:reflect.runtime.universe.TypeTag[T])reflect.runtime.universe.Type

scala> getType(foo) =:= typeOf[Q]
res9: Boolean = false