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

Fre*_*ind 3 scala

我是斯卡拉的新手.我试过这段代码:

val name = "mike"
println(name.getClass())
Run Code Online (Sandbox Code Playgroud)

没关系,打印好了 java.lang.String

但是,当我尝试:

val num = 123
println(num.getClass())
Run Code Online (Sandbox Code Playgroud)

有这样的编译器错误:

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].
Run Code Online (Sandbox Code Playgroud)

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

San*_*ozi 7

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

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

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

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

num.asInstanceOf[AnyRef].getClass
Run Code Online (Sandbox Code Playgroud)

将打印

class java.lang.Integer
Run Code Online (Sandbox Code Playgroud)

如果你想避免装箱(例如你想区分原始值和盒装值),看看HowTo获取_的类:任何