List <Void>的目的是什么?

我甚至不知道这是可行的,但是我在线阅读一些代码时看到了这样一个签名的方法:

public List<Void> read( ... ) 

… 什么? 有没有理由这样做? 这份List甚至能持有什么? 据我所知,这是不可能实例化一个Void对象。

这种方法签名可能是作为某个generics类的副产品而创build的。

例如, SwingWorker有两个types参数,一个用于最终结果,一个用于中间结果。 如果你只是不想使用任何中间结果,你传递Void作为types参数,导致一些方法返回Void – 即没有。

如果在SwingWorker使用Void的方法List<V> returnAllIntermediateResults()作为types参数V ,它将创build一个方法,就像您在问题中发布的一样。

代码将是完全有效的。 你可以用types参数Void实例化List接口的任何实现(例如ArrayList )。 但是Voidtypes唯一的值是null 。 所以如果实现允许null元素,那么这个列表就不能包含任何东西,只能是null

其中可能有用的一种情况是,如果您想从函数返回返回值的集合。 说

 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元素,因为你不能创build一个Voidtypes的对象。 我不认为有这样的事情的实际用途。

Voidjava.lang一部分。 这不是一个特殊的关键字或任何东西。 这是一个“伪types”(根据文档),用于表示与void对应的Class对象,如Class<Void>的占位符。 从Class的文档 :

原始的Javatypes( booleanbytecharshortintlongfloatdouble )以及关键字void也被表示为Class对象。

Void类主要是为了这个的最后部分,所以你可以写:

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

就像你可以写:

 Class<Integer> intType = int.class; // == Integer.TYPE 

我同意,这很奇怪。

我可以看到它的用法,如果你想扩展一个generics类,并从方法返回void。 我遇到了一个案例,我想使用int并不得不使用Integer因为Javagenerics不喜欢原始types。

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

我认为这是Java API所说的,尽pipe说实话我真的找不到NonReturningObjectUserPool