[英]Why is java.io.Serializable not a class?
我理解這個問題聽起來很奇怪,但我想知道為什么java.io.Serializable
接口已經被精確地實現為一個接口,而不是一個類?
讓我思考這一點的是,我們正在談論覆蓋 readObject
/ writeObject
方法,而根據定義,我們不會覆蓋它們(即,我們的Serializable
對象沒有已經實現這些方法的超類型)。
因此,如果Serializable
是一個類,它可以實現默認的 readObject
/ writeObject
方法,然后執行類可以真正覆蓋所述方法。
這是一個不起作用的解決方法,說明了我的話:
public class Serializable implements java.io.Serializable {
private static final long serialVersionUID = 356223041512972356L;
protected void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.defaultReadObject();
}
protected void writeObject(ObjectOutputStream stream) throws IOException {
stream.defaultWriteObject();
}
}
public class MyClass extends Serializable {
private static final long serialVersionUID = -5437634103734137046L;
@Override
protected void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
super.readObject(stream);
// custom readObject method
}
}
PS:提供的解決方法不起作用,因為當我的protected
時,必須將readObject
/ writeObject
方法聲明為private
。
因為如果你想從另一個類繼承並實現Serializable
你真的搞砸了。 這是Java在選擇不支持真正的多重繼承時所做的一般權衡。
你會注意到Java 2.0語言(Groovy和Scala)通過他們所謂的traits或mixins來改變這個決定 - 它們的設計非常精確 ,所以你可以“混入”例如Serializable
功能,而不是邏輯上只是從它派生 - 這你可以把你作為一個非常好的觀點作為證據,而Java本來可以很好地聽取你的意見。
如果java.io.Serializable
是一個類,那么你將無法從另一個基類繼承。
換句話說,它是繼承或序列化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.