2013-03-05 68 views
3

我明白这个问题听起来很奇怪,但我想知道为什么java.io.Serializable接口已经被精确地实现为一个接口,而不是一个类?为什么java.io.Serializable不是一个类?

是什么让我想到这一点,是我们正在谈论首要readObject/writeObject方法,而根据定义,我们不覆盖他们(即没有超类型我们Serializable对象已经实施这些方法)。

因此,如果Serializable将是一个类,它可能已经实现了默认readObject/writeObject方法,然后exenting类可能已经能够真正覆盖说的方法。


下面是一个不工作变通方法,说明了我的话:

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

可能的重复[为什么readObject和writeObject是私有的,为什么我会明确写入瞬态变量?](http://stackoverflow.com/questions/7467313/why-are-readobject-and-writeobject-private-and - 为什么会我写的瞬态变种)resp答案之一:http://stackoverflow.com/a/7472723 – Puce 2013-03-05 16:04:46

+0

方法可能已被放入'对象',就像'克隆'和' Cloneable'。但是,看看为什么'Serializable'不应该是一个类,为什么'Cloneable'是一个糟糕的主意。 – 2013-03-05 18:15:04

+0

这就是为什么任何接口不是一个类的原因。以免限制你可以继承的东西。 – EJP 2013-03-05 23:02:43

回答

12

因为那么你真的搞砸了,如果你想从继承另一个类并实现Serializable。这是Java在选择不支持真正的多重继承时所做的一般权衡。你会注意到Java 2.0语言(Groovy和Scala)通过他们称之为traits或mixins的方式颠倒了这个决定 - 这几乎是正好这样设计的,所以你可以“混入”例如如果没有逻辑地从它衍生出来,你可能会将其作为证据表明你做出了一个非常好的观点,并且Java会很好地听取你的意见。

+0

恩,是的,当然,这很明显......我不知道为什么我在发布问题之前没有考虑它。非常感谢! – sp00m 2013-03-05 15:54:46

+0

由于它是一个接口,因此可以将读取/写入对象的方法签名添加到它,但是那样会需要一个实际上不必要的实现。 – eipark 2013-04-01 20:07:34

4

如果java.io.Serializable会是一个类,那么您将无法继承其他基类。

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