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
)。 但是Void
types唯一的值是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一个Void
types的对象。 我不认为有这样的事情的实际用途。
Void
是java.lang
一部分。 这不是一个特殊的关键字或任何东西。 这是一个“伪types”(根据文档),用于表示与void
对应的Class
对象,如Class<Void>
的占位符。 从Class
的文档 :
原始的Javatypes(
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
我同意,这很奇怪。
我可以看到它的用法,如果你想扩展一个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
。