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


115

JavaでGenericsを使用しているため、Void戻り値の型として関数を実装する必要がありました。

public Void doSomething() {
    //...
}

そしてコンパイラは私が何かを返すことを要求しますnullとりあえず戻るだけですが、それが良いコーディング方法かどうか疑問に思っています...

私は約求めているVではない、OID V OID。予約されたキーワードVoidはなく、クラスvoid

私も試してみたVoid.classvoidVoid.TYPEnew Void()、すべてでは動作しませんノーすべてのリターンが、すべて。(多かれ少なかれ明白な理由で)(詳細についてはこの回答を参照してください)

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

回答:


104

それで、関数の戻り値の型が必要な場合、私は何を返すことになっていますVoidか?

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

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

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

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

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


13
Voidを返す必要があるのは、結局のところファンキーではありません。これは、たとえばCallable <T>によって簡単に要求できます。場合によっては、何かを返す必要はないが、Runnableなどを使用できないことがあります。
ボンベ

私が指摘したように、Voidには正当な用途があります。しかし、彼は「これはジェネリックの使用のために生じただけだ」と述べました。これは、彼がVoidを使用する必要のあるコレクションに対して何かをしたように思えますが、これはかなり例外的なケースです。
John Feminella、2009年

コレクションを使用すると、実際には非常に奇妙です。
ボンベ

Void.classとvoid.classはどちらもClass <Void>ですが、等しくありません。Voidは、Mapの値(またはCollections.newSetFromMapを使用)およびAccessController.doPrivilegedの戻り値の汎用引数としてよく使用されます。
トム・ホーティン-タックライン2009年

@トム:うん。そのため、「(技術的には、Class <Void>が返されます。)」というタグを付けました。その部分を修正する必要がありますか、それともそのまま正確ですか?
John Feminella、2009年



20

あなたが与えた他の提案がうまくいかない理由を明確にするために:

Void.classおよびVoid.TYPE同じオブジェクトを指し、タイプClass<Void>ではなくタイプですVoid

そのため、これらの値を返すことができません。new Void()タイプになりますがVoid、そのコンストラクタは存在しません。実際、にVoidはパブリックコンストラクタがないため、インスタンス化できません。Voidポリモーフィック以外のタイプのオブジェクトはありませんnull

お役に立てれば!:-)


1
マイナー修正:をVoid.TYPE指さないVoid.class。を指しvoid.classます。
shmosel 2015

1

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


私は必須ではありません。それは単なる慣習です。
トムホーティン-タックライン2009年

-2

ちょうどこのような。

public Class TestClass {
    public void testMethod () {
        return;
    }
}

2
OPは言ったVoid、ではないvoid。他の答えはすでに主題をかなりカバーしているようです。
E_net4は、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.