tb1*_*189 41 java collections language-features variadic-functions
在我的Java代码中,我经常使用非常方便的method(Class... args)varargs.据我所知,它们允许您传递任意数量的Class对象或数组Class[].由于我也经常使用Java集合类,因此两者之间缺乏兼容性使我感到沮丧.结果,我最终做了collection.toArray(),但这有一些类型安全问题.
所以现在问题是:为什么Java不允许实例Iterable<T>作为vararg参数,只要泛型类型适合T...vararg 的类型?不是每个人都一直使用列表,集等吗?是否有一种简单,类型安全的方式来提供从集合到vararg的转换?
Joa*_*uer 48
原因很简单:变量arity参数只是一个老派数组参数,带有一些额外的元数据,告诉编译器提供一些语法糖(即,它允许隐式数组创建).
所以从JVM的角度来看Object...几乎是一样的Object[].同样允许集合需要对JVM进行更具侵入性的更改(迄今为止还没有明确支持集合).
请注意,如果您想支持这两种方式,那么制作基于集合的方法可能是更好的方法:
public void frobnicate(Object... args) {
frobnicate(Arrays.asList(args));
}
public void frobnicate(Iterable<Object> args) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这样做的原因是,使用Arrays.asList()是通常比一个更便宜的操作Collection.toArray()(因为它创建一个简单的包装).
| 归档时间: |
|
| 查看次数: |
12475 次 |
| 最近记录: |