将Scala对象作为Java对象传递给Java方法

时间:2018-07-25 19:09:09

标签: scala

我有一个Java方法,它接受一个java.lang.Object。 现在,我试图将Scala Int传递给它,但是编译器抱怨Int和Object的类型不匹配。

这感觉很奇怪,因为我认为Scala Int继承自AnyRef,并且应该与java.lang.Object相同?

2 个答案:

答案 0 :(得分:1)

Scala Int没有扩展AnyRef,但是-它扩展了AnyVal,与Java.lang.Object不兼容,更像Java {{1} }。 Scala还具有int类,它只是Integer的别名-如果需要将其作为对象传递,请使用该类。

答案 1 :(得分:1)

从Scala根类继承的Scala类有两个分支-任何:

  1. AnyVal:所有基于值的类型,例如Int,Byte,Double等。这是Java原始值类的对应物,即int,float等。
  2. AnyRef:所有基于引用的类型,例如字符串,列表,包括带框的Java类型,例如java.lang.Integer ...等。

(请参见https://docs.scala-lang.org/tour/unified-types.html中的图)

AnyRef等效于java.lang.Object。因此,在调用采用Object的Java方法时,装箱前不能直接传输AnyVal。这可以通过显式类型声明完成:

JavaClass.methodWithObject(10:java.lang.Integer)

更多讨论参考: Result type of an implicit conversion must be more specific than AnyRef