これが実行可能かどうかさえ知りませんでしたが、オンラインでいくつかのコードを調べているときに、次のような署名を持つメソッドを見ました。
public List<Void> read( ... )
... 何?これを行う理由はありますか?これは何をList
保持することができますか?私の知る限り、Void
オブジェクトをインスタンス化することはできません。
このメソッドシグネチャは、いくつかの汎用クラスの副産物として作成された可能性があります。
たとえば、にSwingWorker
は2つのタイプパラメータがあります。1つは最終結果用で、もう1つは中間結果用です。中間結果を使用したくない場合はVoid
、typeパラメーターとして渡すと、一部のメソッドが返されますVoid
。つまり、何も返されません。
タイプパラメータとしてwithにメソッドがある場合List<V> returnAllIntermediateResults()
、質問に投稿したのと同じようにメソッドが作成されます。SwingWorker
Void
V
コードは完全に有効です。タイプパラメータを使用して、List
インターフェイスの任意の実装(たとえば)をインスタンス化できます。ただし、型が持つことができる唯一の値はです。したがって、実装で要素が許可されている場合、リストにはs以外のものを含めることはできません。ArrayList
Void
Void
null
null
null
これが役立つ場合の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) {...}});
}
それほど有用ではありませんが、それが必要な場合を見ることができます。
List<Void>
変だ。null
タイプのオブジェクトを作成できないため、要素のみを持つことができますVoid
。そんなことには実用性はないと思います。
Void
の一部ですjava.lang
。特別なキーワードなどではありません。これは、のように、にClass
対応するオブジェクトを表すためのプレースホルダーとして使用される「疑似タイプ」(ドキュメントによる)です。のドキュメントから:void
Class<Void>
Class
プリミティブJavaタイプ(、、、、、、、、、および)
boolean
、およびキーワードもオブジェクトbyte
として表されます。char
short
int
long
float
double
void
Class
このVoid
クラスは主にこの最後の部分のために存在するため、次のように書くことができます。
Class<Void> voidType = void.class; // == Void.TYPE
あなたが書くことができるのと同じように:
Class<Integer> intType = int.class; // == Integer.TYPE
私は同意します、それは奇妙です。
ジェネリッククラスを拡張してメソッドから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
。