默认情况下可以序列化原语’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现在允许在重写方法中使用协变返回类型).无效的讨论混淆了这个问题.
你想要做的是将一个类型参数声明为“将只返回null”. Void通常是一个很好的选择,但是要使Void工作,返回类型必须是Object. Void无法实现API中的每个接口,因为有人可能希望使用它来指示类型参数的null返回.
有三种方法可以查看您的问题:
> Serializable是一种过于严格的类型声明.你应该真正使用Object.你真的需要它是Serializable吗?>您可以将type参数声明为Serializable,并且实际上返回null.这并不能完全表明您每次都返回null,但这可能就足够了.>您可以声明自己的名为Null的类,它实现Serializable,可能作为Root接口的静态嵌套类,并在此情况下将其用作类型参数.您会发现制作自己的Null对象并不常见,即使在标准JDK中也存在(私有)对象.