返回一个Void对象
什么是正确的方式来返回一个Void
types,当它不是一个原始的? 例如。 我目前使用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>();