为啥 AnyVal (Int, Double) 不能是 scala.Serializable 参数的实际参数
Posted
技术标签:
【中文标题】为啥 AnyVal (Int, Double) 不能是 scala.Serializable 参数的实际参数【英文标题】:Why AnyVal (Int, Double) cannot be the actual parameter of scala.Serializable parameter为什么 AnyVal (Int, Double) 不能是 scala.Serializable 参数的实际参数 【发布时间】:2017-09-09 17:36:52 【问题描述】: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 extends java.io.Serializable.是上面的参数。
谢谢。
【问题讨论】:
【参考方案1】:其实Int
没有扩展Serializable。链接(来自已知的子类)是 this 一个,它只是一个 Ordering[Int]
隐式实例。 Int
和 AnyVal
的定义如下:
final abstract class Int private extends AnyVal
abstract class AnyVal extends Any
如您所见,它们不是java.io.Serializable
或scala.Serializable
。
至于代码工作的原因,请查看scala.Predef
以找到从scala.Int
到java.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))
我希望这能消除困惑,我自己也去过那里:)
【讨论】:
我不确定我是否理解最后一部分。但简而言之,scala.Int
和scala.math.Ordering.Int
确实不同。 scala.Int
是一个类,为什么后者只是 Ordering[Int]
的单例实例。后者中的Int
参数类型其实是scala.Int
。以上是关于为啥 AnyVal (Int, Double) 不能是 scala.Serializable 参数的实际参数的主要内容,如果未能解决你的问题,请参考以下文章
sprintf为啥用int和double 数组也可以存进去?
C++ 中的 Visual Studio MFC:为啥“int”有效但“double”无效?