72

APIで

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

  1. 「インスタンス化できない」プレースホルダークラスとは何ですか?いつjava.lang.Void使用されますか?クラスが「インスタンス化できない」場合、それはどのような用途ですか?
  2. java.lang.Voidとの違いは何voidですか?
4

6 に答える 6

105

java.lang.Voidに類似していjava.lang.Integerます。Integerプリミティブ型の値をボックス化する方法ですintVoidプリミティブ型の値をボックス化する方法ですvoid

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

右!それがjava.lang.Void「インスタンス化不可能」なのです。:)

すべてのプリミティブ型に同等のボックスが含まれているのは、Java型システムの優れた機能です。int持っているIntegerlong持っているLongbyte持っているByte...そしてvoid持っているVoidVoid 存在しなかった場合、それは奇妙で非対称になります。

java.lang.Void「では、との違いは何voidですか?」

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

Void「しかし、私は自分のプログラムで何の役にも立ちません。」

そして、私は私の中で何の役にも立ちませんGarbageCollectorMXBean。一部の機能には、わかりにくい用途ありません。大丈夫。

于 2012-09-27T22:00:48.767 に答える
66

の最も一般的な使用法Voidは反射ですが、それが使用される可能性があるのはそれだけではありません。

void関数が値を生成しないことを意味するキーワードです。

java.lang.Voidが参照型の場合、以下が有効です。

 Void nil = null;

(これまでのところ、面白くありません...)

結果としてタイプ(戻り値がタイプVoidの関数)は、関数が*常に*リターンすることを意味します(インスタンスがないため、null以外のものを返すことはできません)。nullVoid

 Void function(int a, int b) {
    //do something
    return null;
 }

常にnullを返す関数が必要なのはなぜですか?

ジェネリックスが発明される前は、のユースケースはありませんでしたVoid

ジェネリックスでは、いくつかの興味深いケースがあります。たとえば、aFuture<T>は、別のスレッドによって実行された非同期操作の結果のホルダーです。Future.get(タイプの)操作値を返し、T計算が実行されるまでブロックします。

しかし...戻るものがない場合はどうなりますか?シンプル:を使用しFuture<Void>ます。たとえば、Google App Engineでは、Asyncronous Datastore Servicedelete操作は将来の. Whenget()is invoked on that future,null`を返し、削除が完了した後に返されます。Callableを使って同様の例を書くことができます。

別のユースケースは、Map値なし、つまりMap<T,Void>。です。このようなマップはのように動作しSet<T>、同等の実装がない場合に役立つ場合がありSetます(たとえば、がない場合はWeakHashSet、を使用できますWeakHashMap<T,Void>)。

于 2013-03-15T05:20:14.030 に答える
57

唯一のポイントVoid、を保持することです。Void.TYPEこれは、のようなものvoid.classです。を返すメソッドへのリフレクティブ参照があり、voidその戻り型を取得すると、が返されますVoid.TYPE

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

于 2012-05-31T18:19:53.823 に答える
5

Voidは、voidのAutoBoxing機能(JDK 1.5以降)です。

ボイドは参照であるのに対し、ボイドはプリミティブ型であることは自明です。

したがって、要件がVoidを使用する必要がある場合は???

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

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

于 2014-10-19T16:05:40.150 に答える
2

使用する別の例VoidSwingWorker

new SwingWorker<Void, Integer> () {
    @Override
    protected Void doInBackground(){
        ...
    }
    @Override
    protected void process(List<Integer> chunk){
        ...
    }
    @Override
    public void done(){
        ...
    }
}.execute();
于 2016-08-31T04:18:36.030 に答える
1

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

たとえば、次のjava 8ラムダ式checkBenefitConcertInCentralParkを使用します。この式は、メソッドに渡された、というメソッドを使用して、EventResourceオブジェクトに特定のプロパティがあるかどうかをチェックします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);
    }
于 2016-05-23T10:47:20.147 に答える