我理解这个问题听起来很奇怪,但我想知道为什么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:提供的解决方法不起作用,因为readObject
/ writeObject
方法必须声明为private
,而我的protected
。
答案 0 :(得分:12)
因为如果你想继承另一个类并实现Serializable
,那么你真的搞砸了。这是Java在选择不支持真正的多重继承时所做的一般权衡。
你会注意到Java 2.0语言(Groovy和Scala)通过他们所谓的traits或mixins来改变这个决定 - 这几乎是完全设计的,所以你可以“混合”,例如Serializable
功能而不是从逻辑上只是从中得出 - 你可以把它作为证据表明你正在提出一个非常好的观点,Java会很好地听取你的意见。
答案 1 :(得分:4)
如果java.io.Serializable
成为一个类,那么你将无法从另一个基类继承。
换句话说,它是继承或序列化。