У меня проблема с ограниченными вложенными подстановочными знаками в обобщениях Java.
Вот типичный случай:
public void doSomething(Set<? extends Number> set) {}
public void callDoSomething() {
Set<Integer> set = new HashSet<Integer>();
doSomething(set);
}
Это стандартные шаблоны Java, работает нормально.
Однако, если подстановочный знак становится вложенным, он больше не работает:
public void doSomething(Map<String, Set<? extends Number>> map) {}
public void callDoSomething() {
Map<String, Set<Integer>> map = new HashMap<String, Set<Integer>>();
doSomething(map);
}
Это приводит к ошибке компилятора.
I ' Я пробовал разные типы бросков и подстановочных знаков, но я не могу заставить это работать. Я не помню, чтобы видел эту проблему раньше, и я работал с дженериками в течение многих лет. Я слишком устал и пропускаю что-то очевидное?
Итак, проблема в том, что doSomething
может быть реализован как:
public void doSomething(Map<String, Set<? extends Number>> map) {
Set<Float> set = ...;
map.put("xyz", set);
}
Вам нужно решить, что вы на самом деле имеете в виду.
Вероятно, что-то вроде:
public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}
это сработает для вас:
public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}
Чтобы заставить код работать Создайте HashMap как:
Map<String, Set<? extents Number>> map = new HashMap<String, Set<? extents Number>>();