Чи розширює програму 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))
Я сподіваюся, що це очистить плутанину, я сам там був :)