プリミティブではない場合、Void
型を返す正しい方法は何ですか?例えば。現在、以下のようにnullを使用しています。
interface B<E>{ E method(); }
class A implements B<Void>{
public Void method(){
// do something
return null;
}
}
Voidクラスは、Javaキーワードvoid。
したがって、次のいずれかで十分です。
Object
でパラメーター化し、new Object()
またはnull
を返すVoid
でパラメーター化し、null
を返すNullObject
を使用したパラメータ化このメソッドをvoid
にすることはできません。他のメソッドはsomethingを返します。その何かは無視されるので、何でも返すことができます。
Java 8では、新しいクラスOptional<T>
、このような場合に使用できます。これを使用するには、次のようにコードをわずかに変更します。
interface B<E>{ Optional<E> method(); }
class A implements B<Void>{
public Optional<Void> method(){
// do something
return Optional.empty();
}
}
これにより、返されるものが何もない場合でも、メソッドからalways null以外の戻り値を取得できます。 null
を返すことができるかできないかを検出するツールと組み合わせて使用すると、特に強力です。 Eclipse @NonNull
および@Nullable
注釈。
タイプとして何も必要ない場合は、voidを使用できます。これは、機能またはアクションの実装に使用できます。次のようなことができます:
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!";
}
});
または、voidアクションの場合(結果を何にも割り当てないことに注意してください)
executeAction(new VoidAction() {
@Override
public void executeInternal() {
//code here
}
});
メソッドが何も返さないことをコンパイラに通知するジェネリック型はありません。
慣習は、型パラメーターとして継承するときにオブジェクトを使用することだと思います
OR
型パラメーターを上に伝搬し、クラスのユーザーがObjectを使用してインスタンス化し、type-wildcard ?
:
interface B<E>{ E method(); }
class A<T> implements B<T>{
public T method(){
// do something
return null;
}
}
A<?> a = new A<Object>();