在scala中编译错误,原因:val num = 123; println(num.getClass())

时间:2010-07-27 08:50:29

标签: 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()?以及如何解决它?

3 个答案:

答案 0 :(得分:7)

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

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

Java类是AnyRefs(引用类的实例= Java中的类实例)。 getClass可以正常工作:AnyRef几乎和java.lang.Object一样 - >它还有一个可以调用的getClass()方法。

正如错误建议您可以强制装箱,然后getClass()将对其起作用:

num.asInstanceOf[AnyRef].getClass

将打印

class java.lang.Integer

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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