使用隐式转换扩展通用Serializable

时间:2016-11-29 20:18:13

标签: scala generics implicit-conversion serializable scala-generics

我正在尝试向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 个答案:

答案 0 :(得分:1)

List延伸Serializable。所以定义List[A].isSer(String); A的类型无关紧要。

Serializable只是一个标记接口,用于指示某个类是否可以序列化。是否能够实际序列化对象取决于以对象为根的整个传递对象图是否可序列化。您的ln将在运行时使用NotSerializableException进行序列化失败,因为它包含非可序列化类型。有关详细信息,请参阅the javadoc for java.lang.Serializablescala.Serializable扩展)。