3

我知道这个问题听起来很奇怪,但我想知道为什么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方法必须声明为privatewhile mine are protected

4

2 回答 2

12

因为如果你想从另一个类继承并实现Serializable. 这是 Java 在选择不支持真正的多重继承时所做的一般权衡。

您会注意到,Java 2.0 语言(Groovy 和 Scala)通过他们所谓的特征或 mixins 扭转了这一决定——它们的设计非常精确,因此您可以“混合”例如Serializable功能,而无需从逻辑上派生出来——您可能会将您的观点作为证据,Java 会很好地听取您的意见。

于 2013-03-05T15:51:08.123 回答
4

如果java.io.Serializable是一个类,您将无法从另一个基类继承。

换句话说,它要么是继承,要么是序列化。

于 2013-03-05T15:52:10.590 回答