Java Génériques, comment éviter les décoché la cession d'avertissement lors de l'utilisation de la hiérarchie de classes?

Je veux utiliser une méthode à l'aide des paramètres génériques et de retourner générique résultat sur une hiérarchie de classe.

edit: pas SupressWarnings("unchecked") réponse possible 🙂

Voici un exemple de code illustrant mon problème:

import java.util.*;
public class GenericQuestion {
interface Function<F, R> {R apply(F data);}
static class Fruit {int id; String name; Fruit(int id, String name) {
this.id = id; this.name = name;}
}
static class Apple extends Fruit { 
Apple(int id, String type) { super(id, type); }
}
static class Pear extends Fruit { 
Pear(int id, String type) { super(id, type); }
}
public static void main(String[] args) {
List<Apple> apples = Arrays.asList(
new Apple(1,"Green"), new Apple(2,"Red")
);
List<Pear> pears = Arrays.asList(
new Pear(1,"Green"), new Pear(2,"Red")
);
Function fruitID = new Function<Fruit, Integer>() {
public Integer apply(Fruit data) {return data.id;}
};
Map<Integer, Apple> appleMap = mapValues(apples, fruitID);
Map<Integer, Pear> pearMap = mapValues(pears, fruitID);
}
public static <K,V> Map<K,V> mapValues(
List<V> values, Function<V,K> function) {
Map<K,V> map = new HashMap<K,V>();
for (V v : values) {
map.put(function.apply(v), v);
}
return map;
}
}

Comment faire pour supprimer le générique exception de ces appels:

Map<Integer, Apple> appleMap = mapValues(apples, fruitID);
Map<Integer, Pear> pearMap = mapValues(pears, fruitID);

Question Bonus: comment faire pour supprimer l'erreur de compilation si je déclare le fruitId Fonction de cette manière:

Function<Fruit, Integer> fruitID = new Function<Fruit, Integer>() {public Integer apply(Fruit data) {return data.id;}};

Je suis très confus au sujet de génériques lorsqu'il est question de hiérarchie. Un pointeur vers une bonne ressource à propos de l'utilisation de, et seront très appréciées.

OriginalL'auteur Guillaume | 2011-03-15