1

我试图将扩展方法添加到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。 ln的内部类型的Serializeable是否有某种强制?我是否试图做一些绝对疯狂的事?

+0

隐式转换可以更改为仅采集可序列化集合,但是然后您的'y.isSer(“Serializable”)用例不会编译,并且您不能同时拥有两个隐式转换器,因为它变得模糊不清隐含的,编译器会拒绝。 – jwvh

+0

我也对此进行了尝试,并且能够在同一时间范围内进行几次隐式自由转换 隐式自定义serToSerops [S <:可序列化](s:S)=新SerOps(s)'隐式自定义serToSerOPsC [C [_] <:Serializable](c:C [_])= new SerOps(c)' 'implicit def serToSeropsCS [C [_] <:Serializable,S <:Serializable] )= new SerOps(c)' –

回答

1

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

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

+0

这对我来说很有意义,也许我的问题更符合以下几点:当你尝试序列化'ln'时会发生什么。尽管如此,我可以肯定地回答自己。谢谢! –