返回一个Void对象

什么是正确的方式来返回一个Voidtypes,当它不是一个原始的? 例如。 我目前使用null如下。

 interface B<E>{ E method(); } class A implements B<Void>{ public Void method(){ // do something return null; } } 

Void类是一个不合理的占位符类,用于保存对表示Java关键字void的Class对象的引用。

所以以下任何一个就足够了:

  • Object参数化并返回new Object()null
  • Void参数化并返回null
  • 用你的NullObject参数化

你不能使这个方法void ,而其他任何东西都会返回。 由于这个东西被忽略了,你可以返回任何东西。

Java 8引入了一个新类, Optional<T> ,可以在这种情况下使用。 要使用它,你可以稍微修改你的代码,如下所示:

 interface B<E>{ Optional<E> method(); } class A implements B<Void>{ public Optional<Void> method(){ // do something return Optional.empty(); } } 

这允许您确保始终从方法中获取非null的返回值,即使没有任何返回值。 当与null可以或不可以被返回的工具结合使用时,这是特别有用的,例如Eclipse @NonNull@Nullable注解。

如果你只是不需要任何东西作为你的types,你可以使用void。 这可以用于实现function或操作。 然后你可以做这样的事情:

 interface Action<T> { public T execute(); } abstract class VoidAction implements Action<Void> { public Void execute() { executeInternal(); return null; } abstract void executeInternal(); } 

或者你可以省略抽象类,并且在每个不需要返回值的操作中都返回null。

然后你可以使用这样的动作:

给定一个方法

 private static <T> T executeAction(Action<T> action) { return action.execute(); } 

你可以这样称呼它

 String result = executeAction(new Action<String>() { @Override public String execute() { //code here return "Return me!"; } }); 

或者,对于无效的行为(请注意,你没有把结果分配给任何东西)

 executeAction(new VoidAction() { @Override public void executeInternal() { //code here } }); 

没有genericstypes会告诉编译器一个方法什么都不返回。

我相信约定是inheritance作为types参数使用对象

要么

传播types参数,然后让你的类的用户使用对象实例化和分配对象的types通配符使用types通配符?

 interface B<E>{ E method(); } class A<T> implements B<T>{ public T method(){ // do something return null; } } A<?> a = new A<Object>();