web-dev-qa-db-ja.com

メソッドの戻り値の型がVoidの場合、何を返しますか? (無効ではありません!)

JavaでGenericsを使用しているため、戻り型としてVoidを持つ関数を実装することになりました。

_public Void doSomething() {
    //...
}
_

コンパイラーはsomethingを返すことを要求します。今のところnullを返しているだけですが、それが良いコーディングのプラクティスかどうか疑問に思っています...

私は[〜#〜] v [〜#〜]‌oidではなく、v‌oid。クラスVoidnot予約キーワードvoid

また、_Void.class_、void、_Void.TYPE_、new Void()を試しましたが、戻り値はありませんが、すべてが機能しません。 (多かれ少なかれ明白な理由について)(詳細については this answer を参照)

  • 関数の戻り値の型がVoidの場合、何を返すことになっていますか?
  • Voidクラスの一般的な用途は何ですか?
112
Daniel Rikowski

関数の戻り値の型がVoidでなければならない場合、何を返すことになっていますか?

return nullを使用します。 Voidはインスタンス化できず、Class<T>タイプのvoidの単なるプレースホルダーです。

Voidのポイントは何ですか?

上記のように、それはプレースホルダーです。 Voidは、たとえば、リフレクションを使用して、戻り型がvoidのメソッドを調べる場合に返されるものです。 (技術的には、Class<Void>が返されます。)Callable<T>をパラメーター化する場合など、これらの行に沿って他のさまざまな用途があります。

Javaでジェネリックを使用しているため、この関数を実装する必要がありました

このシグニチャを使用してメソッドを実装する必要がある場合、APIに何かおかしなことがあると思います。希望することを行うためのより良い方法があるかどうかを慎重に検討してください(おそらく、別のフォローアップの質問で詳細を提供できますか?)。これは「ジェネリックの使用のため」にしか出てこなかったので、私は少し疑っています。

103
John Feminella

Voidをインスタンス化する方法はないため、canを返すのはnullだけです。

25
Jon Bright

return nullは進むべき道です。

20
Bombe

他の提案が機能しない理由を明確にするために:

Void.classVoid.TYPEは同じオブジェクトを指し、_Voidではなく、Class<Void>型です。

そのため、これらの値を返すことはできません。 new Void()Void型になりますが、そのコンストラクターは存在しません。実際、Voidにはパブリックコンストラクターがないため、インスタンス化できません。多態性Voidを除いて、null型のオブジェクトを使用することはできません。

お役に立てれば! :-)

20
Martijn

あいまいな理由でこの型を使用しなければならない場合、戻り値はとにかく使用されないので、実際にnullを返すことは賢明なオプションのようです。
とにかく、コンパイラーは何かを返すように強制します。
そして、このクラスにはパブリックコンストラクターがないようですので、new Void()は使用できません。

0
PhiLho