Вложенный универсальный шаблон Java не будет компилироваться

У меня проблема с ограниченными вложенными подстановочными знаками в обобщениях 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 ' Я пробовал разные типы бросков и подстановочных знаков, но я не могу заставить это работать. Я не помню, чтобы видел эту проблему раньше, и я работал с дженериками в течение многих лет. Я слишком устал и пропускаю что-то очевидное?

10
задан Pang 24 February 2016 в 02:18
поделиться

3 ответа

Итак, проблема в том, что 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) {}
15
ответ дан 3 December 2019 в 21:57
поделиться

это сработает для вас:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}
1
ответ дан 3 December 2019 в 21:57
поделиться

Чтобы заставить код работать Создайте HashMap как:

Map<String, Set<? extents Number>> map = new HashMap<String, Set<? extents Number>>();
0
ответ дан 3 December 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: