Расширение универсальных Serializables с неявными преобразованиями

Я пытаюсь добавить методы расширения Serializable типы и, кажется, есть дыра в моем понимании класса. Вот фрагмент из основ того, что я пытаюсь сделать:

class YesSer extends Serializable

class NoSer 

implicit class SerOps[S <: Serializable](s: S) {
  def isSer(msg: String) = {
    println(msg)
    assert(s.isInstanceOf[Serializable])
  }
}

val n = new NoSer
val ln = List(new NoSer, new NoSer)
val y = new YesSer
val ly = List(new YesSer, new YesSer)
// n.isSer("non Serializable")
ln.isSer("list of non Serializable")
y.isSer("Serializable")
ly.isSer("list of Serializable")

List продолжается Serializable

Для меня очевидна линия n.isSer не скомпилируется, но также кажется, что ln.isSer также не должен компилироваться, так как его "внутренний" тип - NoSer. Есть ли какое-то принуждение к Serializeable внутреннего типа ln? Я пытаюсь сделать что-то абсолютно помешанное??

1 ответ

Решение

List продолжается Serializable, Так List[A].isSer(String) определено; тип A не имеет значения.

Serializable это просто интерфейс маркера, используемый для указания того, предназначен ли класс для сериализации. Сможете ли вы на самом деле сериализовать объект, зависит от того, будет ли сериализуем весь граф транзитивных объектов с корнем в этом объекте. Ваш ln не будет сериализации во время выполнения с NotSerializableException потому что он содержит несериализуемые типы. См. Javadoc для java.lang.Serializable (который scala.Serializable расширяется) для более подробной информации.

Другие вопросы по тегам