使用隐式转换扩展泛型 Serializable

Posted

技术标签:

【中文标题】使用隐式转换扩展泛型 Serializable【英文标题】:Extending generic Serializables with implicit conversions 【发布时间】: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 &lt;: Serializable](s: S) = new SerOps(s) implicit def serToSerOPsC[C[_] &lt;: Serializable](c: C[_]) = new SerOps(c) implicit def serToSerOPsCS[C[_] &lt;: Serializable, S &lt;: Serializable](c: C[S]) = new SerOps(c) 【参考方案1】:

List 扩展 Serializable。所以定义了List[A].isSer(String)A 的类型无关紧要。

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

【讨论】:

这对我来说很有意义,也许我的问题更像是:当您尝试序列化 ln 时会发生什么。这是一个我当然可以回答自己的问题。谢谢!

以上是关于使用隐式转换扩展泛型 Serializable的主要内容,如果未能解决你的问题,请参考以下文章

使用带有约束的泛型时无法隐式转换类型[重复]

Scala隐式转换和泛型

Scala:从泛型类型到第二泛型类型的隐式转换

使用泛型类和隐式强制转换修复枚举限制

泛型类型的隐式转换?

出现无法隐式转换类型泛型列表的错误