39

これが実行可能かどうかさえ知りませんでしたが、オンラインでいくつかのコードを調べているときに、次のような署名を持つメソッドを見ました。

public List<Void> read( ... )

... 何?これを行う理由はありますか?これは何をList保持することができますか?私の知る限り、Voidオブジェクトをインスタンス化することはできません。

4

4 に答える 4

26

このメソッドシグネチャは、いくつかの汎用クラスの副産物として作成された可能性があります。

たとえば、にSwingWorkerは2つのタイプパラメータがあります。1つは最終結果用で、もう1つは中間結果用です。中間結果を使用したくない場合はVoid、typeパラメーターとして渡すと、一部のメソッドが返されますVoid。つまり、何も返されません。

タイプパラメータとしてwithにメソッドがある場合List<V> returnAllIntermediateResults()、質問に投稿したのと同じようにメソッドが作成されます。SwingWorkerVoidV

コードは完全に有効です。タイプパラメータを使用して、Listインターフェイスの任意の実装(たとえば)をインスタンス化できます。ただし、型が持つことができる唯一の値はです。したがって、実装で要素が許可されている場合、リストにはs以外のものを含めることはできません。ArrayListVoidVoidnullnullnull

于 2012-11-22T20:28:27.027 に答える
12

これが役立つ場合の1つは、関数から戻り値のコレクションを返したい場合です。言う

static List<T> forEach(Func<A,T> func, List<A> items) {
   List<T> ret = new List<T>();
   for(int i = 0; i< items.length; i++) {
     ret.add(func.call(items[i]);
   }
   return ret;
}

public static void main() {
  ...
  List<Void> boringResult = 
   forEach(
    new Func<Void, Integer> {@override Void call(Integer i) {...}});
}

それほど有用ではありませんが、それが必要な場合を見ることができます。

于 2012-11-22T20:38:00.420 に答える
9

List<Void>変だ。nullタイプのオブジェクトを作成できないため、要素のみを持つことができますVoid。そんなことには実用性はないと思います。

Voidの一部ですjava.lang。特別なキーワードなどではありません。これは、のように、にClass対応するオブジェクトを表すためのプレースホルダーとして使用される「疑似タイプ」(ドキュメントによる)です。のドキュメントから:voidClass<Void>Class

プリミティブJavaタイプ(、、、、、、、、、および)boolean、およびキーワードもオブジェクトbyteとして表されます。charshortintlongfloatdoublevoidClass

このVoidクラスは主にこの最後の部分のために存在するため、次のように書くことができます。

Class<Void> voidType = void.class; // == Void.TYPE

あなたが書くことができるのと同じように:

Class<Integer> intType = int.class; // == Integer.TYPE
于 2012-11-22T20:27:10.417 に答える
4

私は同意します、それは奇妙です。

ジェネリッククラスを拡張してメソッドからvoidを返したい場合は、その使用法を見ることができます。Javaジェネリックはプリミティブ型が好きではないので、使用したいと思って使用intしなければならなかったケースにぶつかりました。Integer

public interface ObjectUserPool<E, T> {
    public E useObject(T o);
}

public class NonReturningObjectUserPool extends ObjectUserPool<Void, Integer> {
    public Void useObject(Integer i);
}

これはJavaAPIが言っていることだと思いますが、正直なところ、の用途は実際には見つかりませんNonReturningObjectUserPool

于 2012-11-22T20:32:18.790 に答える