Ce code est simplifié autant que possible à partir d'une structure de classe plus complexe. Dans le code réel, il y avait des sous-types des types Integer et Double que j'utilise ici. J'essaie d'utiliser Java Generics avec un paramètre de type. Si l'utilisateur demande le type Number.class
, nous souhaitons combiner la liste List<Integer>
et la liste List<Double>
en une seule liste. Pendant que le code fonctionne, je ne peux pas obtenir l'avertissement d'incantation non cochée (voir l'étiquette TODO).Avertissement de cast non coché avec Java Generics, paramètre de type et liste retournée
L'avertissement est:
Type safety: Unchecked cast from List<Integer> to Collection<? extends T>
Mais, si je retire le casting, je reçois une erreur de compilation:
The method addAll(Collection<? extends T>) in the type List<T> is not applicable for the arguments (List<Integer>).
Mon code:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class Generics1 {
static final List<Integer> intList = new ArrayList<Integer>(Arrays.asList(
1, 2, 3, 4));
static final List<Double> dblList = new ArrayList<Double>(Arrays.asList(
1.1, 2.2, 3.3));
public static <T extends Number> List<T> getObjects(Class<T> type) {
List<T> outList = new ArrayList<T>();
if (type == Number.class) {
// user asked for everything
// TODO: unchecked cast warnings here should be fixed
outList.addAll((Collection<? extends T>) intList);
outList.addAll((Collection<? extends T>) dblList);
} else {
// user asked for subtype of number
if (Integer.class.isAssignableFrom(type)) for (Integer i : intList)
if (type.isInstance(i)) {
T obj = type.cast(i);
outList.add(obj);
}
if (Double.class.isAssignableFrom(type)) for (Double d : dblList)
if (type.isInstance(d)) {
T obj = type.cast(d);
outList.add(obj);
}
}
return outList;
}
public static void main(String[] args) {
System.out.println("HI!");
System.out.println("integers: " + getObjects(Integer.class));
System.out.println("doubles: " + getObjects(Double.class));
System.out.println("numbers: " + getObjects(Number.class));
}
}
est-SuppressWarnings ("sans contrôle") assez pour vous? – ninjalj
J'ai oublié de mentionner, j'ai édité ce post pour mettre les génériques dans les messages d'erreur dans les blocs de code, de sorte que vous pouvez voir les types génériques utilisés. – Powerlord
merci d'avoir édité ce post. –