【问题标题】: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.是上面的参数。

谢谢。

【问题讨论】:

    标签: scala serializable


    【解决方案1】:

    其实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))
    

    我希望这能消除困惑,我自己也去过那里:)

    【讨论】:

    • 我不确定我是否理解最后一部分。但简而言之,scala.Intscala.math.Ordering.Int 确实不同。 scala.Int 是一个类,为什么后者只是 Ordering[Int] 的单例实例。后者中的Int参数类型其实是scala.Int
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多