【发布时间】:2017-04-13 23:46:13
【问题描述】:
我正在尝试向Serializable 类型添加扩展方法,但我对该类的理解似乎存在漏洞。这是我正在尝试做的基础知识的 sn-p:
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。 ln 的内部类型对Serializeable 是否有某种强制?我是在尝试做一些绝对疯狂的事情吗??
【问题讨论】:
-
可以将隐式转换更改为仅采用可序列化的集合,但是您的
y.isSer("Serializable")用例将无法编译,并且您不能同时拥有两个隐式转换器,因为这会成为模棱两可的隐式,编译器将拒绝。 -
我也对此进行了实验,并且能够同时在范围内进行多个隐式 def 转换
implicit def serToSerOPs[S <: Serializable](s: S) = new SerOps(s)implicit def serToSerOPsC[C[_] <: Serializable](c: C[_]) = new SerOps(c)implicit def serToSerOPsCS[C[_] <: Serializable, S <: Serializable](c: C[S]) = new SerOps(c)
标签: scala generics implicit-conversion serializable scala-generics