web-dev-qa-db-ja.com

Java.lang.Voidとvoidの違いは何ですか?

APIで

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

  1. 「インスタンス化できない」プレースホルダークラスとは何ですか? Java.lang.Voidはいつ使用されますか?クラスが「インスタンス化不能」である場合、それはどのような用途に使用されますか?
  2. Java.lang.Voidvoidの違いは何ですか?
55
user1357722

Voidの-​​ポイントのみは、Void.TYPEのようなもので、void.classを保持します。 voidを返すメソッドへのリフレクション参照があり、その戻り値の型を取得すると、Void.TYPEを返します。

他の目的に使用することはできませんし、使用すべきではありません。

50
Louis Wasserman

Java.lang.VoidJava.lang.Integer に類似しています。 Integerは、プリミティブ型intの値をボクシングする方法です。 Voidは、プリミティブ型voidの値をボクシングする方法です。

「しかし、待ってください、voidには可能な値がありません!」

正しい!それがJava.lang.Voidを「インスタンス化不能」にするものです。 :)

これはJava型システムのすてきな機能です。すべてのプリミティブ型にはボックス化された同等物があります。intIntegerを、longLongbyteにはByte...があり、voidにはVoidがあります。Voiddind'tが存在します。

「それでは、Java.lang.Voidvoidの違いは何ですか?」

簡単です。 voidはプリミティブ型です。 Voidは、Objectを継承する参照型です。それらはどちらも可能な値を持たないという点で似ています。しかし、それにもかかわらず、タイプシステムの観点からは、2つの非常に異なるタイプです。

「しかし、私のプログラムではVoidを使用していません。」

そして、私はGarbageCollectorMXBeanを使用していません。いくつかの機能は、haveを非あいまいに使用しません。大丈夫。

94
Quuxplusone

Voidは(JDK 1.5以降の)voidのオートボクシング機能です。

Voidは参照ですが、voidはプリミティブ型です。

そのため、要件がVoid ???

プリミティブを使用できないジェネリック型の一般的な使用法。

たとえば、Android AsyncTaks<Params, Progress, Result> Progress updateを取得したくない場合はどうなりますか。ここではvoid(プリミティブ型)を使用できません。Java.lang.Voidが必要です

5
Amit Yadav

Voidを使用する別の例は、SwingWorkerです。

new SwingWorker<Void, Integer> () {
    @Override
    protected Void doInBackground(){
        ...
    }
    @Override
    protected void process(List<Integer> chunk){
        ...
    }
    @Override
    public void done(){
        ...
    }
}.execute();
2
Maxwell Cheng

メソッド自体の外部でメソッドの戻り値の型を指定する必要がある場合があるため、Voidは便利です。

たとえば、これは Java 8ラムダ式 で、これはEventResourceオブジェクトに特定のプロパティがあるかどうかを、checkBenefitConcertInCentralParkというメソッドを使用してcheckCreatedEventメソッドに渡してチェックします。

eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark);

checkBenefitConcertInCentralParkメソッドは次のように定義されます(Voidの使用に注意してください):

    public static Void checkBenefitConcertInCentralPark(EventResource eventResource) { 
        // JUnit code here...
        // assertThat(blablabla  :)  )

        return null; // we can only return null at the end of a method when returning Void
    }

そして、checkBenefitConcertInCentralParkメソッドがcheckCreatedEventメソッドに渡されます。

    // Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
    public void checkCreatedEvent(Function<EventResource, Void> function) { 
        function.apply(this.eventResource);
    }
1
John Deverall