微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

解决方法

… aa.getClass == a.Inner and ba.getClass == b.Inner,but in fact they are both Outer.Inner and equal

这不是真的. 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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐