2010-07-27 74 views
3

我是新来的scala。我想这样的代码:在scala编译错误,为什么:val num = 123; println(num.getClass())

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中的对象”,为什么我不能调用num.getClass()?以及如何解决它?

回答

7

是的,一切都是对象,而是一个Java类/东西用的getClass()方法:)

Java原始值(和单位)没有必要的一个实例是在斯卡拉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

非常感谢! – Freewind 2010-07-27 10:08:14

3

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

+0

感谢您的回答。我只学了2天scala,对scala知之甚少。我认为它有一个“getClass()”,因为我认为每个对象都应该从java.lang.Object继承。而且,你的意思是,在scala中,并不是每个对象都是从java.lang.Ojbect继承而来的? – Freewind 2010-07-27 09:18:18

4

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

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

+0

值类不是scala.Any的直接子类,而是scala.AnyVal ... – 2010-07-27 09:53:59

相关问题