为什么 Java varargs 不支持集合?

在我的Java代码中,我经常使用非常方便的varargs。据我所知,它们允许您传递任意数量的对象或.由于我也经常使用Java集合类,因此我对两者之间缺乏兼容性感到沮丧。结果,我最终做了,但这有一些类型的安全问题。method(Class... args)ClassClass[]collection.toArray()

那么现在的问题是:为什么Java不允许作为vararg参数的实例,只要泛型类型适合vararg的类型?不是每个人都一直在使用列表,集合等吗?有没有一种简单、类型安全的方法来提供从集合到 vararg 的转换?Iterable<T>T...


答案 1

原因很简单:变量 arity 参数只是一个老式的数组参数,其中包含一些额外的元数据,告诉编译器提供一些语法糖(即,它允许隐式数组创建)。

因此,从JVM的角度来看,它与.允许集合也需要对 JVM 进行更具侵入性的更改(到目前为止,JVM 对集合没有显式支持)。Object...Object[]

请注意,如果要同时支持这两种方式,那么基于集合的方法可能是更好的方法:

public void frobnicate(Object... args) {
  frobnicate(Arrays.asList(args));
}

public void frobnicate(Iterable<Object> args) {
  // do stuff
}

这样做的原因是使用通常比(因为它创建了一个简单的包装器)更便宜的操作。Arrays.asList()Collection.toArray()


答案 2