169

Java Void-- 大文字の V --参照型があります。私がこれまでに使用した唯一の状況は、Callables をパラメータ化することです

final Callable<Void> callable = new Callable<Void>() {
            public Void call() {
                foobar();
                return null;
            }
        };

VoidJava参照型の他の用途はありますか? 以外のものを割り当てることはできますnullか? はいの場合、例はありますか?

4

11 に答える 11

123

Voidは、関心のない一般的な引数の慣例となっています。 など、他のインスタンス化できない型を使用する必要がある理由はありませんSystem

また、たとえばMap値 (ただし、マップとしてCollections.newSetFromMap使用する場合は値Booleanを受け入れる必要はありませんnull) やjava.security.PrivilegedAction.

于 2009-03-13T18:35:02.450 に答える
52

反射を使用して Void のインスタンスを作成できますが、それらは何の役にも立ちません。Void は、ジェネリック メソッドが何も返さないことを示す方法です。

Constructor<Void> constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);

のようなものを印刷します

I have a java.lang.Void@75636731
于 2009-03-13T21:43:34.120 に答える
28

Future<Void>魅力のように機能します。:)

于 2009-03-13T18:11:48.840 に答える
20

パブリック コンストラクターがないことを考えると、null. 例が示すように、「このジェネリックパラメーターを使用する必要はありません」のプレースホルダーとしてのみ使用しました。

Javadocの記述から、リフレクションで使用することもできます。

Void クラスは、Java キーワード void を表す Class オブジェクトへの参照を保持する、インスタンス化できないプレースホルダー クラスです。

于 2009-03-13T18:12:00.447 に答える
19

すべてのプリミティブ ラッパー クラス ( IntegerByteBooleanDoubleなど) には、静的TYPEフィールド内の対応するプリミティブ クラスへの参照が含まれています。次に例を示します。

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class

Voidvoid型への参照を配置する場所として最初に作成されました。

Void.TYPE == void.class

ただし、を使用しても実際には何も得られませんVoid.TYPE。を使用すると、その型void.classで何かを行っていることがより明確になります。void

余談ですが、前回試した時はBeanShellが を認識しなかったvoid.classので、そこを使わないといけませんVoid.TYPE

于 2009-03-13T22:20:35.187 に答える
6

ジェネリックの前は、リフレクション API 用に作成され、void メソッドの Method.getReturnType() によって返された TYPE を保持し、他のプリミティブ型クラスに対応していました。

編集: Void の JavaDoc から:「Void クラスは、Java キーワード void を表す Class オブジェクトへの参照を保持する、インスタンス化できないプレースホルダー クラスです」。Generics の前は、リフレクション以外の用途がないことを認識しています。

于 2009-03-14T21:41:22.443 に答える
3

Void をインスタンス化できないので、 Apache commons の Null オブジェクトを使用できるので、

Null aNullObject = ObjectUtils.Null;
Null noObjectHere = null;

最初の行にはオブジェクトがあるのでaNullObject != null成立し、2 行目には参照がないのでnoObjectHere == null成立します。

投稿者の元の質問に答えるために、これの使用法は、「何もない」と「何もない」を区別することです。これらはまったく異なるものです。

PS: Null オブジェクト パターンにノーと言う

于 2015-01-07T19:34:08.307 に答える
2

Voidプリミティブvoid型をラップするために作成されました。すべてのプリミティブ型には、対応する参照型があります。Voidジェネリッククラスをインスタンス化するか、ジェネリックメソッドを使用するために使用されます。これは、興味のないジェネリック引数です。例を次に示します...

public void onNewRegistration() {
    newRegistrationService.createNewUser(view.getUsername(), view.getPassword(),
            view.getInitialAmount(), view.getCurrency(), new AsyncCallback<Void>() {
      @Override
      public void onFailure(Throwable caught) {
          
      }

      @Override
      public void onSuccess(Void result) {
        eventBus.fireEvent(new NewRegistrationSuccessEvent());
      }
    });
  } 

ここでは、ご覧のとおり、新しい登録を作成するように要求しているサーバーから何も望んでいませんpublic interface AsyncCallback<T> { .... }が、ジェネリック インターフェイスであるためVoid、ジェネリックはプリミティブ型を受け入れないため、提供します。

于 2012-04-21T07:30:08.550 に答える
0

また、オブジェクトが必要ない場合、Async-IO 完了コールバックでもよく使用されAttachmentます。その場合は、IO 操作に null を指定して実装しCompletionHandler<Integer,Void>ます。

于 2014-08-10T15:33:42.987 に答える
0

まれなケースかもしれませんが、一度、Voidアスペクトクラスで使用したことがあります。

これは、@Logアノテーションを持つメソッドの後に実行され、返されたメソッドと、メソッドの戻り値の型が void でない場合にいくつかの情報をログに記録するアスペクトでした。

 @AfterReturning(value = "@annotation(log)", 
       returning = "returnValue", 
       argNames = "joinPoint, log, returnValue"
      )
    public void afterReturning(final JoinPoint joinPoint, final Log log,
            final Object returnValue) {

            Class<?> returnType = ((MethodSignature) joinPoint.getSignature())
            .getReturnType();
           if (Void.class.isAssignableFrom (returnType)) ) {
            //Do some log
         }
}
于 2015-12-13T08:09:38.997 に答える