为什么AnyVal(Int,Double)不能是scala.Serializable参数的实际参数

时间:2017-04-13 14:27:43

标签: scala serializable

AnyVal(Int,Double)是否扩展了scala.Serializable,java.io.Serializable和scala.Serializable之间的区别是什么作为Scala中的方法参数?

def f (p : scala.Serializable): Unit = {}
def g (p : java.io.Serializable): Unit = {}
//f(1) Type mismatch, expected:Serializable,actual:Int 
g(1) //It works 

Scala文档说Int是scala.Serializable的子类型(http://www.scala-lang.org/api/2.10.6/index.html#scala.Serializable).However,scala.Serializable扩展了java.io.Serializable。所以我认为Int的值是scala.Serializable和java.io.Serializable的类型。两者都可以是上面的参数。

感谢。

1 个答案:

答案 0 :(得分:2)

实际上Int不会扩展Serializable。链接(来自已知的子类)是this,它只是一个Ordering[Int]隐式实例。 IntAnyVal定义如下:

final abstract class Int private extends AnyVal
abstract class AnyVal extends Any

您可以看到,他们不是java.io.Serializablescala.Serializable

至于代码的工作原理,请查看scala.Predef以查找从scala.Intjava.lang.Integer(实现java.io.Serializable)的隐式转换。 scala.Predef是隐式导入的,这就是它起作用的原因:

object Predef {
  ...
  implicit def int2Integer(x: Int) = java.lang.Integer.valueOf(x)
  ...
}

所以在幕后你的代码如下:

g(1)

// After the implicit conversion g(1) is actually:
g(Integer.valueOf(1))

我希望这能解决困惑,我自己一直在那里:)