返回一个Void对象

Rob*_*ert 104 java generics return-value

返回Void类型的正确方法是什么,当它不是原始类型时?例如.我目前使用null如下.

interface B<E>{ E method(); }

class A implements B<Void>{

    public Void method(){
        // do something
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 123

Void类是一个不可实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用.

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

  • 参数化Object和返回new Object()null
  • 参数化Void和返回null
  • NullObject你的一个参数化

你不能让这种方法void,和其他任何返回的东西.由于忽略了某些东西,你可以返回任何东西.

  • 如果您想将 null 作为 void 返回,则在某些情况下需要对其进行强制转换: (Void) null (3认同)
  • 那么实现返回类型的void的一般正确方法是什么? (2认同)

Eri*_*rom 13

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

interface B<E>{ Optional<E> method(); }

class A implements B<Void>{

    public Optional<Void> method(){
        // do something
        return Optional.empty();
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许您确保始终从方法中获得非null返回值,即使没有任何返回值也是如此.当与检测何时null可以或不可以返回的工具结合使用时,这尤其强大,例如Eclipse @NonNull@Nullable注释.

  • 我的意见是,这是朝着错误的方向发展的.最好是返回一个更具约束力的类型,以传达更清晰的含义.由于与你给出的原因相同,返回一个"Optional <Void>"的东西是不必要的,你_always_得到一个空的"Optional <Void>",因此所有其他方法都没有意义.这与应该使用可选值的原因相反.您使用它是因为它可能有也可能没有值.编译器也不能强制执行`method()`正确实现它.这会在运行时失败:`return Optional.of(null)`. (3认同)