Apache HttpClientパッケージにResponseHandler
を実装しています。
new ResponseHandler<int>() {
public int handleResponse(...) {
// ... code ...
return 0;
}
}
しかし、私はhandleResponse
関数が何も返さないようにしたい、すなわちvoid
。これは可能ですか? void
は有効なJava=タイプではないため、以下はコンパイルされません。
new ResponseHandler<void>() {
public void handleResponse(...) {
// ... code ...
}
}
void
をVoid
に置き換えてVoid
オブジェクトを返すことができると思いますが、それは実際には私が望むものではありません。 質問:void
からhandleResponse
を返すことができるように、このコールバック状況を整理することは可能ですか?
ジェネリックはオブジェクトクラスのみを処理します。 void型とプリミティブ型はジェネリックでサポートされていないため、これらをパラメーター化された型として使用することはできません。代わりにVoidを使用する必要があります。
Void
を使用したくない理由を説明できますか?
Void
タイプは、この正確な状況のために作成されました。サブタイプが「void」になる可能性がある汎用戻りタイプを持つメソッドを作成するためです。 Void
は、そのタイプのオブジェクトが作成されないように設計されています。したがって、タイプVoid
のメソッドは常にnull
を返します(または異常終了します)。 return null
メソッドでは使用できますが、これはささいな不便にすぎません。
要するに、Void
を使用してください。
Java.lang.Void
を返す必要がある場合は、null
を返すだけです。
ジェネリックにプリミティブを含めることはできないため、int
は実際にはinteger
になります。オブジェクトVoid
は、ジェネリックのキーワードvoid
と類似しています。
残念ながら不可能です。あなたが言うようにVoid
を返すようにコードを設定できますが、Void
をインスタンス化することはできないため、実際に関数を書くことはできません。この仕様に準拠しています。
考えてみてください:ジェネリック関数は「この関数はX型の何かを返す」と言っており、Xを指定できますが、文を「この関数は何も返しません」に変更することはできません。 (これらのセマンティクスに同意するかどうかはわかりませんが、そうです。)
この場合、私がいつもしていることは、関数がObject
型を返すようにし、実際には常にnull
を返すことです。
この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() {}
}