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

标签 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;
  }
}

最佳答案

好的,根据您的示例,不,如果您将方法更改为 void 它将不起作用,因为该方法必须具有返回类型(即使 Java 现在允许协变返回类型重写的方法)。 void 的讨论混淆了这个问题。

您要做的是将类型参数声明为“将只返回 null”。 Void 通常是一个不错的选择,但要使 Void 起作用,返回类型必须是 Object。 Void 不能实现 API 中的每个接口(interface),只是因为有人可能想用它来指示类型参数的 null 返回。

可以通过三种方式来看待你的问题:

  1. Serializable 是一种限制过度的类型声明。你真的应该使用 Object.你真的需要它是可序列化的吗?
  2. 您可以只将类型参数声明为 Serializable,实际上返回 null。这并不完全表明您每次都返回 null,但这可能就足够了。
  3. 您可以声明您自己的名为 Null 的类,它实现了 Serializable,也许作为 Root 接口(interface)的静态嵌套类,并在这种情况下将其用作类型参数。您会发现创建自己的 Null 对象并不少见,即使在标准 JDK 中也有(私有(private)的)对象。

关于java - 为什么 java.lang.Void 不可序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4971136/

相关文章:

java - 测试 applicationContext : org. springframework.core.annotation.AnnotationUtils.getAnnotationAttributes

java - 来自 Google App Engine/Google Web 工具包的 Web 服务?

Haskell Data.Void : undefined turns into infinite loop

java - 调用无效方法

c - 分配时为空*

java - Micronaut:如何映射 HashMap 中的所有属性值?

java - 调试和正常执行模式之间的不同行为 - WeakReference 处理

java - 使用 OAuth 身份验证面对 SSLHandshakeException

c - 什么是 "better": (x=x) or (void(x)) for unused parameters?

c - 如何在 C 中使用 cast?