我如何知道内部类的两个对象是否具有相同的运行时类型?在下面的示例中,我希望看到aa.getClass == a.Inner和ba.getClass == b.Inner的类,但实际上它们都是Outer.Inner且相等。
class Outer{
class Inner{}
}
val a = new Outer
val b = new Outer
val aa = new a.Inner
val ab = new a.Inner
val ba = new b.Inner
val res1 = aa.getClass == ba.getClass
val res2 = aa.isInstanceOf[ab.type ]
scala> | | defined class Outer
scala> a: Outer = Outer@550a1967
scala> b: Outer = Outer@5f9678e1
scala> aa: a.Inner = Outer$Inner@70a36a66
scala> ab: a.Inner = Outer$Inner@1dd6d4b7
scala> ba: b.Inner = Outer$Inner@2e61d218
scala> res1: Boolean = true
scala> res2: Boolean = false
... aa.getClass == a.Inner和ba.getClass == b.Inner,但实际上它们都是Outer.Inner且相等
这不是真的。Inner
是一类成员,是唯一其父实例的Outer
。这意味着a
和b
都具有自己的唯一版本Inner
,这是不兼容的类型。所以a.Inner
是不相同的类型b.Inner
,并且因此一个a.Inner
永远不能等于一个b.Inner
。我不能为另一个分配一个:
scala> val z: a.Inner = aa // aa is a.Inner, so this is ok
z: a.Inner = Outer$Inner@575d06dd
scala> val z: b.Inner = aa // aa is not b.Inner, so it fails to compile
<console>:14: error: type mismatch;
found : a.Inner
required: b.Inner
val z: b.Inner = aa
^
getClass
只是在这里不是很有用。
我们可以通过反思来证明这一点:
import scala.reflect.runtime.universe._
def tpeOf[A](a: A)(implicit tt: TypeTag[A]) = tt.tpe
scala> tpeOf(aa) =:= tpeOf(ba) // different Outer parents
res24: Boolean = false
scala> tpeOf(aa) =:= tpeOf(aa) // Same instance
res25: Boolean = true
scala> tpeOf(aa) =:= tpeOf(ab) // Same Outer parent
res26: Boolean = true
另一方面,您可以Outer#Inner
用来指定您不在乎Outer
您的Inner
类型属于哪个类型。
val x: Outer#Inner = aa
val x: Outer#Inner = ab
val x: Outer#Inner = ba
因此,如@BenReich所述,您可以aa.isInstanceOf[Outer#Inner]
用来检查是否有这些类型中的任何一个,并且它们都将返回true
。
ab.type
意味着完全不同的东西。ab.type
是单例类型,除了之外什么都不包含ab
。那么自然就aa.isInstanceOf[ab.type]
必须是假的,因为aa
不是ab
,无论它们是否都是a.Inner
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句