为什么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了一个简单的包装器)。