Напомним, что Integer
, а также Double
расширяют Number
и, в свою очередь, Number
расширяют Object
.
A List<Number>
никоим образом не может использоваться как List<Integer>
и наоборот . List<Number> x = new ArrayList<Integer>
не компилируется . Это называется «инвариантностью», и это «правильно», потому что, если бы он компилировался, вы могли бы добавить двойники к списку целых чисел, что явно неверно. Тем не менее, это имеет тенденцию сбивать людей с толку, поэтому я упоминаю об этом. Если вам нужна ковариация или контравариантность, вы должны выбрать эту : List<? extends Number> list = new ArrayList<Integer>();
выполняет компиляцию . Но тогда list.add(5);
не будет, потому что, если бы это было так, вы снова могли бы добавлять двойники к списку целых чисел, а это было бы неправильно. Всякая проверка типов для дженериков прямо за дверью, а вы этого не хотите. Можете ли вы «уйти с рук»? Что ж, компилятор подбросит вам в лицо кучу предупреждений, и вы отключите проверку типов. Если вы имеете в виду «сойдет с рук»: «Компилируется»? Да, это так. Если вы имеете в виду: «Пройдет ли этот код какой-либо разумный код java кодера»? Нет, не будет .
Простое решение: что плохого в использовании MyGenericType<?>
здесь?
NB: ключи на картах должны быть неизменяемыми; списка нет. Поэтому его использование - довольно плохой план; что это должно означать?