scala类型系统:2) classOf与getClass方法的差异

前一篇在提到获取Class时的两个方法:classOf 和 getClass

scala> class  A
scala> val a = new A

scala> a.getClass
res2: Class[_ <: A] = class A

scala> classOf[A]
res3: Class[A] = class A

上面显示了两者的不同,getClass 方法得到的是 Class[A]的某个子类,而 classOf[A] 得到是正确的 Class[A],但是去比较的话,这两个类型是equals为true的

scala> a.getClass  == classOf[A]
res13: Boolean = true

这种细微的差别,体现在类型赋值时,因为java里的 Class[T]是不支持协变的,所以无法把一个 Class[_ < : A] 赋值给一个 Class[A]

scala> val c:Class[A] = a.getClass
<console>:9: error: type mismatch;

scala类型系统:2) classOf与getClass方法的差异》上有15条评论

  1. fair_jm

    协变 逆协变 不协变这些概念有点晕晕的…
    原来写过一段笔记不知道对不对…

    C[T] A B 其中A <: B
    若 C[A]:C[B] C 是 cotravariant
    如果 C[A]和C[B]没有父子关系 那么C是nonvariant

    Scala中是允许你自己定义是否是variant的
    class C[+A]{…} C是covariant
    class C[-A]{…} C是contrvariant
    class C[A] {…} C是nonvariant(默认)

    回复
    1. fair_jm

      有一段被过滤掉了….
      若 C[A]<:C[B] C 是 covariant
      若 C[A]>:C[B] C 是 cotravariant

      回复
  2. askyer

    scala> a.getClass == classOf[A]
    res13: Boolean = true

    2.11版本已经是false

    回复
    1. hongjiang 文章作者

      你确定?你的小版本号是什么?我机器上是2.11.0-RC4 刚测试了一下还是true.

      回复
        1. magj

          2.11.4 测 试是false

          scala> a.getClass == classOf[A]
          res18: Boolean = false

          回复
          1. magj

            前面版本写错了
            [hadoop@slave1 ~]$ scala
            Welcome to Scala version 2.11.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_45).

            但是在下面版本下
            C:\Documents and Settings\Administrator>scala
            Welcome to Scala version 2.11.0-M4 (Java HotSpot(TM) Client VM, Java 1.8.0_20).

            scala> a.getClass == classOf[A]
            res2: Boolean = true

  3. hongjiang 文章作者

    你能把完整的scala版本jdk版本信息 以及执行过程 贴出来吗?我特意下载了一个 2.11.0 的,在 jdk7下运行,也是true

    % export JAVA_HOME=”/System/Library/Frameworks/JavaVM.framework/Versions/jdk1.7/Home” && ./scala
    Welcome to Scala version 2.11.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67).
    Type in expressions to have them evaluated.
    Type :help for more information.

    scala> class A
    defined class A

    scala> val a = new A
    a: A = A@c3cec2e

    scala> a.getClass == classOf[A]
    res0: Boolean = true

    回复
        1. hongjiang 文章作者

          这个问题很蹊跷,不太可能这种低级bug在编译器反复出现,能否在repl下把重现的步骤给出来。

          回复
        2. kavn

          Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_102)
          scala> class A
          defined class A

          scala> val a = new A
          a: A = A@6f7923a5

          scala> a.getClass == classOf[A]
          res3: Boolean = true

          回复
  4. zile

    Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_102).
    Type in expressions for evaluation. Or try :help.
    win7 64位
    a.getClass == classOf[A]
    该版本是false

    回复
  5. hongjiang 文章作者

    所有所 a.getClass == classOf[A] 为 false 的能否把完整的代码片段贴出来,我怀疑是你们自己的错误,所有反馈说false的没有一个人给出完整的验证过程。
    就像我下面在最新的2.12.1版本里完整的验证过程:

    /data/tools/scala-binary/scala-2.12.1/bin [14:41:16]
    ➜ ./scala
    Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_51).
    Type in expressions for evaluation. Or try :help.

    scala> class A
    defined class A

    scala> val a = new A
    a: A = A@1a3e5f23

    scala> a.getClass == classOf[A]
    res0: Boolean = true

    如果你用的版本得到的是 false ,请贴出完整的过程,避免是你自己的失误。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注