可変引数を期待するメソッドに文字列と文字列配列を渡す簡単でエレガントで再利用可能な方法があるかどうか疑問に思っています。
/**
* The entry point with a clearly separated list of parameters.
*/
public void separated(String p1, String ... p2) {
merged(p1, p2, "another string", new String[]{"and", "those", "one"});
}
/**
* For instance, this method outputs all the parameters.
*/
public void merged(String ... p) {
// magic trick
}
すべてのタイプが一貫している場合でも ( String
)、JVM にp2を平坦化し、マージされたパラメーター リストに挿入するように指示する方法が見つかりませんか?
この時点で唯一の方法は、新しい配列を作成し、すべてをコピーして関数に渡すことです。
何か案が?
編集
ここでのあなたの提案に基づいて、私が使用する一般的な方法があります:
/**
* Merge the T and T[] parameters into a new array.
*
* @param type the destination array type
* @param parameters the parameters to merge
* @param <T> Any type
* @return the new holder
*/
@SuppressWarnings("unchecked")
public static <T> T[] normalize(Class<T> type, Object... parameters) {
List<T> flatten = new ArrayList<>();
for (Object p : parameters) {
if (p == null) {
// hum... assume it is a single element
flatten.add(null);
continue;
}
if (type.isInstance(p)) {
flatten.add((T) p);
continue;
}
if (p.getClass().isArray() &&
p.getClass().getComponentType().equals(type)) {
Collections.addAll(flatten, (T[]) p);
} else {
throw new RuntimeException("should be " + type.getName() +
" or " + type.getName() +
"[] but was " + p.getClass());
}
}
return flatten.toArray((T[]) Array.newInstance(type, flatten.size()));
}
normalize(String.class, "1", "2", new String[]{"3", "4", null}, null, "7", "8");