/ / Чому AnyVal (Int, Double) не може бути фактичним параметром skala.Serializable параметр - scala, serializable

Чому AnyVal (Int, Double) не може бути фактичним параметром scala.Serializable параметр - scala, serializable

Чи розширює програму AnyVal (Int, Double) шкалу масштабу.Серіалізація і чим відрізняється 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.http://www.scala-lang.org/api/2.10.6/index.html#scala.Serializable).Однак,scala.Serializable розширює java.io.Serializable. тому я думаю, що значення Int є різновидом типу scala.Serializable і java.io.Serializable, і обидва можуть бути параметром вище.

Дякую.

Відповіді:

2 для відповіді № 1

Насправді Int не поширює серіалізабельність. Посилання (з відомих підкласів) є це той, який є просто 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))

Я сподіваюся, що це очистить плутанину, я сам там був :)