Посмотрите на крайний случай. Допустим, IFace
является acutally Object
, ваш код будет выглядеть следующим образом:
static Map<String, Object> myMap = new HashMap<>();
public static void main(String[] args) throws Exception {
myMap.put("ONE", 1);
myMap.put("TWO", "TWO");
myMap.put("THREE", new Date());
final Calendar calendar1 = getThing("ONE");
final Calendar calendar2 = getThing("TWO");
final Calendar calendar3 = getThing("THREE");
}
public static <T> T getThing(String key) {
return (T) myMap.get(key);
}
Таким образом, вы ставите на class
чем extends Object
в вашу Map
(так что любой class
).
Но когда вы вызываете getThing
, вы делаете неявный приведение к вашему желаемому типу. Должно быть достаточно очевидно, что я могу позвонить getThing
с любым class
, и он будет слепо пытаться применить к нему.
В приведенном выше примере я помещаю некоторые вещи в свой Map
, а затем пытаюсь восстановить их все как Calendar
.
Отвечая на мой собственный вопрос: Нет, это не потому, что я могу иметь два РАЗНЫХ класса 'ClassA' и' ClassB', которые реализуют 'IFace' в' faces'. Во время выполнения 'T' может быть' ClassA' или 'ClassB'. – Cheetah
Помечено, так как мне очень интересна аналогичная проблема –
Почему здесь есть дженерики? Если вы просто ссылаетесь на вещи как «IFace», вам не нужны дженерики/литье. –