List <void>的目的是什么?</void>

时间:2012-11-22 20:23:35

标签: java list generics void

我甚至不知道这是可行的,但我在网上仔细阅读了一些带有这样签名的方法:

public List<Void> read( ... )

......什么?有没有理由这样做?这List甚至可以持有什么?据我所知,无法实例化Void对象。

4 个答案:

答案 0 :(得分:24)

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

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

如果List<V> returnAllIntermediateResults()中的SwingWorker方法Void作为类型参数V,则会创建一个方法,就像您在问题中发布的一样。< / p>

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

答案 1 :(得分: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) {...}});
}

没有用,但你可以看到需要的情况。

答案 2 :(得分:9)

List<Void>很奇怪。它只能有null个元素,因为您无法创建Void类型的对象。我不认为这样的事情有实际用途。

Voidjava.lang的一部分。它不是一个特殊的关键字或任何东西。它是一个“伪类型”(根据文档),曾经作为占位符来表示与Class对应的void对象,如Class<Void>中所示。来自the docs for Class

  

原始Java类型(booleanbytecharshortintlongfloat,和double),关键字void也表示为Class个对象。

Void类的存在主要是为了最后一部分,所以你可以写:

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

就像你可以写:

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

答案 3 :(得分:4)

我同意,这很奇怪。

如果你想扩展泛型类并从方法返回void,我可以看到它的用途。我碰到了一个案例,我想使用int并且必须使用Integer,因为java泛型不喜欢原始类型。

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

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

我认为这就是java API所说的,但老实说我找不到NonReturningObjectUserPool的用途。