为什么Java可变参数不支持集合?

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

所以现在的问题是:为什么Java不允许Iterable<T>实例作为可变参数,只要genericstypes符合可变参数的T...types? 不是每个人都使用列表,集合等吗? 有没有一个简单的,types安全的方式来提供从收集转换为可变参数?

原因很简单:可变参数参数只是一个老派的参数,它带有一些额外的元数据,告诉编译器提供一些语法糖(即允许隐式数组创build)。

所以从JVM Object...的angular度来说Object...Object[]几乎是一样的。 允许集合也需要对JVM进行更多的入侵式更改(迄今为止对集合没有明确的支持)。

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

 public void frobnicate(Object... args) { frobnicate(Arrays.asList(args)); } public void frobnicate(Iterable<Object> args) { // do stuff } 

原因是使用Arrays.asList() 通常Collection.toArray()更便宜(因为它创build了一个简单的包装器)。