默认情况下可以序列化原语 '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;
}
}
最佳答案
好的,根据您的示例,不,如果您将方法更改为 void
它将不起作用,因为该方法必须具有返回类型(即使 Java 现在允许协变返回类型重写的方法)。 void
的讨论混淆了这个问题。
您要做的是将类型参数声明为“将只返回 null”。 Void 通常是一个不错的选择,但要使 Void 起作用,返回类型必须是 Object。 Void 不能实现 API 中的每个接口(interface),只是因为有人可能想用它来指示类型参数的 null 返回。
可以通过三种方式来看待你的问题:
- Serializable 是一种限制过度的类型声明。你真的应该使用 Object.你真的需要它是可序列化的吗?
- 您可以只将类型参数声明为 Serializable,实际上返回 null。这并不完全表明您每次都返回 null,但这可能就足够了。
- 您可以声明您自己的名为 Null 的类,它实现了 Serializable,也许作为 Root 接口(interface)的静态嵌套类,并在这种情况下将其用作类型参数。您会发现创建自己的 Null 对象并不少见,即使在标准 JDK 中也有(私有(private)的)对象。
关于java - 为什么 java.lang.Void 不可序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4971136/