【问题标题】:Compile error in scala, why: val num =123;println(num.getClass())scala中的编译错误,原因:val num =123;println(num.getClass())
【发布时间】:2010-07-27 08:50:28
【问题描述】:

我是 scala 的新手。我试过这段代码:

val name = "mike"
println(name.getClass())

没关系,打印java.lang.String

但是,当我尝试时:

val num = 123
println(num.getClass())

有这样的编译错误:

type mismatch; found : Int required: ?{val getClass: ?} Note: primitive types are not implicitly 
 converted to AnyRef. You can safely force boxing by casting x.asInstanceOf[AnyRef].

我记得scala说过“一切都是scala中的对象”,为什么我不能调用num.getClass()?以及如何解决?

【问题讨论】:

    标签: scala


    【解决方案1】:

    是的,一切都是对象,但不一定是 java 类的实例/具有 getClass() 方法的东西:)

    Java 原始值(和 Unit)是 scala 中的 AnyVals(所谓的值类的实例),并且 - 只要有可能 - 它们最后都会编译为 Java 原始值。当不可能完成装箱时(类似于 Java 中的自动装箱)。但是 - 正如错误报告的那样 - 在您的情况下(“隐式”)没有发生拳击。值类没有 getClass() 方法 -> 编译错误。

    Java 类是 AnyRefs(引用 1234562 的实例 = Java 中的类实例)。 getClass 可以很好地处理它们:AnyRef 实际上与 java.lang.Object 相同 -> 它还有一个您可以调用的 getClass() 方法。

    正如错误提示,您可以强制装箱,然后 getClass() 将对其进行处理:

    num.asInstanceOf[AnyRef].getClass
    

    将打印

    class java.lang.Integer
    

    如果您想避免装箱(例如,您想区分原始值和装箱值),请查看 HowTo get the class of _ :Any

    【讨论】:

      【解决方案2】:

      getClass 方法仅适用于参考类(即 scala.AnyRef)。 123 是 value class 的成员(即 scala.Any),因此没有 getClass 方法。

      有关 Scala 对象层次结构,请参阅 http://www.scala-lang.org/node/128。还有 www.scala-lang.org/docu/files/api/scala/AnyRef.html for AnyRef。

      【讨论】:

        【解决方案3】:

        一切都是对象并不意味着每个对象都有方法getClass。 正如编译器所说,123.asInstanceOf[AnyRef].getClass 可以工作。

        【讨论】:

        • 感谢您的回答。我刚学了 scala 2 天,对 scala 知之甚少。我认为它有一个“getClass()”,因为我认为每个对象都应该从 java.lang.Object 扩展。而且,您的意思是,在 Scala 中,并非每个对象都从 java.lang.Ojbect 扩展而来?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 2021-03-21
        • 1970-01-01
        相关资源
        最近更新 更多