我是斯卡拉的新手.我试过这段代码:
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()?以及如何解决它?
是的,一切都是一个对象,但不一定是一个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获取_的类:任何
| 归档时间: |
|
| 查看次数: |
512 次 |
| 最近记录: |