繁体   English   中英

为什么Java varargs不支持集合?

[英]Why doesn't Java varargs support collections?

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

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

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

因此,从JVM Object...的角度来看Object...Object[]几乎相同。 同样允许集合需要对JVM进行更具侵入性的更改(迄今为止还没有明确支持集合)。

请注意,如果您想支持这两种方式,那么制作基于集合的方法可能是更好的方法:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM