web-dev-qa-db-ja.com

Java varargsがコレクションをサポートしないのはなぜですか?

私のJavaコードでは、非常に便利なmethod(Class... args) varargsをよく使用します。私の知る限り、任意の数のClassオブジェクトまたは_Class[]_の配列。Javaコレクションクラスもよく使用するため、両方の互換性がないことに不満を感じています。その結果、collection.toArray()ですが、これにはいくつかのタイプの安全性の問題があります。

では、質問です。ジェネリック型がvarargの_Iterable<T>_型に適合する限り、なぜJava _T..._のインスタンスをvararg引数として許可しないのですか?誰もが常にリストやセットなどを使用しているわけではありませんか?コレクションからvarargへの変換を提供する簡単でタイプセーフな方法はありますか?

41
tb189

理由は単純です。可変アリティパラメーターは、コンパイラーに構文糖衣構文を提供するように指示するいくつかの追加メタデータを備えた単純な旧式の配列パラメーターです(つまり、暗黙的な配列作成を可能にします)。

したがって、JVMの観点からは、_Object..._は_Object[]_とほとんど同じです。コレクションも許可するには、JVMをより侵襲的に変更する必要があります(これまでのところ、コレクションは明示的にサポートされていません)。

両方の方法をサポートしたい場合は、コレクションベースの方法を作成する方がおそらくより良いアプローチであることに注意してください。

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

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

これは、Arrays.asList()の使用が通常Collection.toArray()よりも安価な操作であるためです(単純なラッパーが作成されるため)。

48
Joachim Sauer