List <Void>的目的是什么?

ast*_*eri 36 java generics list void

我甚至都不知道这是可行的,但我在网上浏览了一些带有如下签名的方法:

public List<Void> read( ... )
Run Code Online (Sandbox Code Playgroud)

... 什么?有没有理由这样做?这List甚至可以举办什么?据我所知,实例化一个Void对象是不可能的.

Jak*_*rka 24

此方法签名可能是作为某个泛型类的副产品创建的.

例如,SwingWorker有两个类型参数,一个用于最终结果,一个用于中间结果.如果您只是不想使用任何中间结果,Void则将其作为类型参数传递,从而导致某些方法返回Void- 即没有.

如果有一个方法,List<V> returnAllIntermediateResults()SwingWorkerVoid作为类型参数V,它会创建就像你在你的问题贴的方法.

代码完全有效.您可以使用type参数实例化List接口的任何实现(例如ArrayList)Void.但是Void类型可以拥有的唯一价值是null.因此null,如果实现允许null元素,则列表除了s之外不能包含任何其他内容.

  • @Jeff我不太喜欢Void类型.通常当我看到它时,它意味着一些先进的难以理解的类型巫术正在进行中.我看到的唯一"可靠"用途是使用SwingWorker. (3认同)

Dav*_*ers 11

它可能有用的一种情况是,如果要从函数返回一组返回值.说

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) {...}});
}
Run Code Online (Sandbox Code Playgroud)

没那么有用,但你可以看到需要的情况.


Ted*_*opp 9

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
Run Code Online (Sandbox Code Playgroud)

就像你可以写:

Class<Integer> intType = int.class; // == Integer.TYPE
Run Code Online (Sandbox Code Playgroud)