Vous ne pouvez pas ne devriez pas (*) le faire dans une seule méthode. Item[]
et List<Item>
sont sans rapport avec les types.
Vous devriez faire une des surcharges appel de l'autre: soit something(Item... items)
des appels something(List<Item>)
ou something(List<Item>)
des appels something(Item... items)
.
De ces deux options, c'est mieux pour le tableau de surcharge pour appeler la liste de surcharge:
public void something(Item... items) {
something(Arrays.asList(item));
}
Ce n'est pas cher, car il ne copie pas le tableau, mais plutôt l'enveloppe: la création de l' List
est O(1)
.
Si vous étiez à invoquer le tableau de surcharge à partir de la liste de surcharge:
public void something(List<Item> items) {
something(items.toArray(new Item[0]));
}
Ce serait plus cher, puisque l' toArray
appel a pour créer et remplir un tableau: c'est un O(n)
, où d' n
est la taille de la liste. Cependant, il a le léger avantage que something
ne serait pas en mesure de remplacer le contenu de l' List
, depuis les mises à jour de la matrice sont tout simplement jetés après l'exécution.
(*) Vous pouvez, mais il serait vraiment brut, et non pas de type sûr, que vous devez accepter un Object
paramètre, comme il n'y a aucune autre commune de la super type d' List<Item>
et Item[]
; et que vous souhaitez toujours avoir à répéter les boucles pour les deux types; et vous en aurez pour gérer la possibilité de complètement différent type de cours passé (à l'exécution):
public void something(Object obj) {
if (obj instanceof List) {
for (Object element : (List<?>) obj) {
Item item = (Item) element; // Potential ClassCastException.
doStuff();
}
} else if (obj instanceof Item[]) {
for (Item item : (Item[]) obj) {
doStuff();
}
} else {
throw new IllegalArgumentException();
}
}
Quel gâchis. Remercier le créateur pour les surcharges.