为什么AnyVal(Int, Double)不能作为scala.Serializable参数的实参
Why AnyVal (Int, Double) cannot be the actual parameter of scala.Serializable parameter
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。所以我认为 Int 的值是 scala.Serializable 的类型并且java.io.Serializable 两者都可以是上面的参数。
谢谢。
实际上Int
不扩展Serializable。 link(来自已知的子类)是 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))
我希望这能消除困惑,我自己也去过那里:)
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。所以我认为 Int 的值是 scala.Serializable 的类型并且java.io.Serializable 两者都可以是上面的参数。
谢谢。
实际上Int
不扩展Serializable。 link(来自已知的子类)是 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))
我希望这能消除困惑,我自己也去过那里:)