为什么';Java varargs支持集合吗?

为什么';Java varargs支持集合吗?,java,collections,language-features,variadic-functions,Java,Collections,Language Features,Variadic Functions,在我的Java代码中,我经常使用非常方便的方法(Class…args)varargs。据我所知,它们允许您传递任意数量的Class对象或Class[]数组。因为我也经常使用Java集合类,所以我对两者之间缺乏兼容性感到沮丧。结果,我最终执行了collection.toArray(),但这存在一些类型安全问题 那么现在来问一个问题:为什么Java不允许Iterable的实例作为vararg参数,只要泛型类型符合vararg的t.类型?不是每个人都在使用列表、集合等吗?是否有一种简单、类型安全的方法

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


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

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

因此,从JVM
对象的角度来看……
对象[]
几乎相同。允许集合也需要对JVM进行更具侵入性的更改(到目前为止,JVM还没有对集合的明确支持)

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

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

public void frobnicate(Iterable<Object> args) {
  // do stuff
}
public void frobnate(对象…参数){
Frobnite(Arrays.asList(args));
}
公共无效副本(Iterable args){
//做事
}

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

它从技术角度回答了这个问题,但作为开发人员,我仍然认为,每当我想同时使用集合和普通对象时,提供一个helper方法是愚蠢的。当然,与几年前相比,我们有收藏品和varargs这一事实已经让人松了一口气。@Elite绅士:我只是更喜欢使用
frobnite
,而不是简单的
foo
@tb189:为什么是“助手方法”?您需要一个方法来接受两种不同的、类型无关的参数。这正是重载设计用来处理的问题。@Jaochim Sauer:当然,我同意重载方法实际上在概念上做了一些事情(例如double->int=rounding,String->int=parsing,可能有错误)。但是,在这种情况下,作为语言的用户(不是技术专家),我觉得数组和集合在功能上是相同的,可以在屏幕后面进行转换。@tb189:这就是我不同意的地方:它们不是相同的东西。在我看来,阵列是一个普通开发人员不应该关心的低级实现细节。所有“不止一个”的东西都应该是一个集合。仅仅因为内部集合和vararg使用数组并不意味着业务代码也应该使用它们。