Void
それがプリミティブではないときに、型を返す正しい方法は何ですか?例えば。現在、以下のようにnullを使用しています。
interface B<E>{ E method(); }
class A implements B<Void>{
public Void method(){
// do something
return null;
}
}
Void
それがプリミティブではないときに、型を返す正しい方法は何ですか?例えば。現在、以下のように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
他のものは何かを返します。その何かは無視されるので、何でも返すことができます。
return (Void)null;
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
アノテーションなど、返される可能性があるかどうかを検出するツールと組み合わせて使用すると特に強力です。
Optional<Void>
あなたが与えるのと同じ理由で何かを返すものを持つことは不必要です、あなたはいつもOptional<Void>
空のものを手に入れるので、他のすべてのメソッドは無意味です。これは、オプションの値を使用する必要がある理由の逆です。値がある場合とない場合があるため、これを使用します。また、コンパイラはmethod()
それを正しく実装することを強制できません。これは実行時に失敗します:return Optional.of(null)
。
タイプとして何も必要ない場合は、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
}
});
それだけのために、もちろんVoid
リフレクションを使用してインスタンスを作成する可能性があります:
interface B<E>{ E method(); }
class A implements B<Void>{
public Void method(){
// do something
try {
Constructor<Void> voidConstructor = Void.class.getDeclaredConstructor();
voidConstructor.setAccessible(true);
return voidConstructor.newInstance();
} catch (Exception ex) {
// Rethrow, or return null, or whatever.
}
}
}
本番環境では、おそらくそれを行わないでしょう。
メソッドが何も返さないことをコンパイラーに伝えるジェネリック型はありません。
慣習は、型パラメーターとして継承するときにObjectを使用することです
または
型パラメーターを上に伝播し、クラスのユーザーが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>();
A<?>
、の戻り値を使用できませんmethod()
。