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
迈克尔·扎亚克(Michael Zajac)

... aa.getClass == a.Inner和ba.getClass == b.Inner,但实际上它们都是Outer.Inner且相等

这不是真的。Inner是一类成员,是唯一其父实例Outer这意味着ab都具有自己的唯一版本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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

比较打字对象的外部类型

来自分类Dev

如何从伴随对象引用 Scala 内部类

来自分类Dev

Scala:在内部类型上获取TypeTag

来自分类Dev

Scala:在内部类型上获取TypeTag

来自分类Dev

如何在Scala中从内部类引用外部对象

来自分类Dev

如何在Scala中从内部类引用外部对象

来自分类Dev

TypeScript:推断带注释对象内部类型的泛型

来自分类Dev

从内部类对象访问外部类函数

来自分类Dev

从内部类对象访问外部类函数

来自分类Dev

在scala中,如何使抽象类型的内部类型对不同实例保持不变?

来自分类Dev

静态内部类的调用对象

来自分类Dev

克隆内部类定义的对象

来自分类Dev

内部类通用类型与外部类型相同

来自分类Dev

从匿名指针类型检索内部类型

来自分类Dev

如何获取模板类型的内部类型?

来自分类Dev

如何在Scala中创建通用列表monoid来维护所涉及列表的内部类型?

来自分类Dev

如何将某些内部类的类类型从Java源传递到Scala?

来自分类Dev

在 C++ 中从内部类对象获取外部类对象

来自分类Dev

在linq中以一对多关系获取最内部类型的对象

来自分类Dev

Scala是否支持内部类泛型

来自分类Dev

内部类中的Scala本机方法

来自分类Dev

使用内部类作为类型参数

来自分类Dev

在Python 3中从内部类访问外部类对象

来自分类Dev

获取对匿名内部类的类对象的引用

来自分类Dev

获取匿名内部类的Class <?>对象

来自分类Dev

Java内部类和捕获对象

来自分类Dev

模拟访问外部对象从局部内部类

来自分类Dev

Java内部类-访问外部对象的变量

来自分类Dev

从私有内部类创建对象