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'時會發生什麼。儘管如此,我可以肯定地回答自己。謝謝! –