web-dev-qa-db-ja.com

Javaジェネリックvoid / Void型

Apache HttpClientパッケージにResponseHandlerを実装しています。

new ResponseHandler<int>() {
    public int handleResponse(...) {
        // ... code ...
        return 0;
    }
}

しかし、私はhandleResponse関数が何も返さないようにしたい、すなわちvoid。これは可能ですか? voidは有効なJava=タイプではないため、以下はコンパイルされません。

new ResponseHandler<void>() {
        public void handleResponse(...) {
            // ... code ...
        }
}

voidVoidに置き換えてVoidオブジェクトを返すことができると思いますが、それは実際には私が望むものではありません。 質問voidからhandleResponseを返すことができるように、このコールバック状況を整理することは可能ですか?

65
Travis Webb

ジェネリックはオブジェクトクラスのみを処理します。 void型とプリミティブ型はジェネリックでサポートされていないため、これらをパラメーター化された型として使用することはできません。代わりにVoidを使用する必要があります。

Voidを使用したくない理由を説明できますか?

51
Peter Lawrey

Voidタイプは、この正確な状況のために作成されました。サブタイプが「void」になる可能性がある汎用戻りタイプを持つメソッドを作成するためです。 Voidは、そのタイプのオブジェクトが作成されないように設計されています。したがって、タイプVoidのメソッドは常にnullを返します(または異常終了します)。 return nullメソッドでは使用できますが、これはささいな不便にすぎません。

要するに、Voidを使用してください。

79
ILMTitan

Java.lang.Voidを返す必要がある場合は、nullを返すだけです。

4
Ken Chu

ジェネリックにプリミティブを含めることはできないため、intは実際にはintegerになります。オブジェクトVoidは、ジェネリックのキーワードvoidと類似しています。

1
Tnem

残念ながら不可能です。あなたが言うようにVoidを返すようにコードを設定できますが、Voidをインスタンス化することはできないため、実際に関数を書くことはできません。この仕様に準拠しています。

考えてみてください:ジェネリック関数は「この関数はX型の何かを返す」と言っており、Xを指定できますが、文を「この関数は何も返しません」に変更することはできません。 (これらのセマンティクスに同意するかどうかはわかりませんが、そうです。)

この場合、私がいつもしていることは、関数がObject型を返すようにし、実際には常にnullを返すことです。

1
Adrian Smith

このJava.lang.Voidの実装は、Java一種の発言です。また、これをジェネリックに結び付ける記事を書きました。これを理解し始める前に少し考えました:- http://www.siteconsortium.com/h/D00006.php 。注意TYPE = Class.getPrimitiveClass( "void");

パッケージJava.lang;

public final class Void {

    public static final Class<Void> TYPE = Class.getPrimitiveClass("void");

    private Void() {}
}
0
Jon