scala:比较内部类对象的类型
我如何知道内部类的两个对象是否具有相同的运行时类型?
在下面的例子中,我希望看到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 解决方法
这不是真的. 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来指定您不关心您的Inner类型属于哪个Outer. 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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |