为什么java.lang.Void不能序列化?

Tom*_*s F 8 java void

默认情况下可以序列化原语'void',为什么对象'Void'不能扩展Serializable?

添加示例:

RootImplementation将有一个编译错误,说"Void不在其范围内",因为它没有扩展Serializable.虽然将'someMethod'声明为'void',但这不是问题.

public interface Root<R extends Serializable> extends Serializable {
  R someMethod();
}

public class RootImplementation implements Root<Void> {
  public Void someMethod() {
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

Yis*_*hai 5

好的,作为对你的例子的回应,如果你将方法改为void它就行不行,因为该方法必须有一个返回类型(即使Java现在允许在重写方法中使用协变返回类型).讨论void混淆了这个问题.

你想要做的是将一个类型参数声明为"将只返回null".Void通常是一个很好的选择,但是要使Void工作,返回类型必须是Object.Void无法实现API中的每个接口,因为有人可能希望使用它来指示类型参数的null返回.

有三种方法可以查看您的问题:

  1. Serializable是一种过于严格的类型声明.你应该真正使用Object.你真的需要它是Serializable吗?
  2. 您只需将type参数声明为Serializable,并在实践中返回null.这并不能完全表明您每次都返回null,但这可能就足够了.
  3. 您可以声明自己的名为Null的类,它实现Serializable,可能作为Root接口的静态嵌套类,并在此情况下将其用作类型参数.你会发现制作你自己的Null对象并不罕见,即使在标准JDK中也存在(私有)对象.