运维开发网

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

运维开发网 https://www.qedev.com 2020-07-26 18:15 出处:网络 作者:运维开发网整理
我是斯卡拉的新手.我试过这段代码: val name = "mike" println(name.getClass()) 没关系,打印java.lang.String 但是,当我尝试: val num = 123 println(num.getClass()) 有这样的编译器错误: type mismatch; found : Int required: ?{val getClass: ?} No
我是斯卡拉的新手.我试过这段代码:

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

是的,一切都是一个对象,但不一定是一个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

0

精彩评论

暂无评论...
验证码 换一张
取 消