使用隐式转换扩展通用可序列化对象
Extending generic Serializables with implicit conversions
我正在尝试向 Serializable
类型添加扩展方法,但我对 class 的理解似乎存在漏洞。这是我正在尝试做的基础知识的片段:
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
也不应该编译,因为它的 "inner" 类型是 NoSer。 ln
的内部类型 Serializeable
是否存在某种强制转换?我是不是想做一些绝对疯狂的事情??
List
扩展 Serializable
。所以定义了List[A].isSer(String)
; A
的类型无关紧要。
Serializable
只是一个标记接口,用来表示一个class是否设计为可序列化。您是否能够实际序列化该对象取决于以该对象为根的整个传递对象图是否可序列化。您的 ln
将在运行时使用 NotSerializableException
序列化失败,因为它包含不可序列化的类型。有关详细信息,请参阅 the javadoc for java.lang.Serializable(scala.Serializable
扩展)。
我正在尝试向 Serializable
类型添加扩展方法,但我对 class 的理解似乎存在漏洞。这是我正在尝试做的基础知识的片段:
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
也不应该编译,因为它的 "inner" 类型是 NoSer。 ln
的内部类型 Serializeable
是否存在某种强制转换?我是不是想做一些绝对疯狂的事情??
List
扩展 Serializable
。所以定义了List[A].isSer(String)
; A
的类型无关紧要。
Serializable
只是一个标记接口,用来表示一个class是否设计为可序列化。您是否能够实际序列化该对象取决于以该对象为根的整个传递对象图是否可序列化。您的 ln
将在运行时使用 NotSerializableException
序列化失败,因为它包含不可序列化的类型。有关详细信息,请参阅 the javadoc for java.lang.Serializable(scala.Serializable
扩展)。