我是斯卡拉的新手。我试过这段代码:
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()
?以及如何解决它?
答案 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可以工作。