Я просмотрел эти темы
Тем не менее, я по-прежнему кажусь потерянным с super ключевым словом:
-
Когда мы объявляем такую коллекцию:
List<? super Number> list = null; list.add(new Integer(0));//this compiles list.add(new Object());//this doesn't compileне должно быть обратного - у нас есть список, содержащий некоторые объекты (неизвестного типа), которые являются родителями
Number. ПоэтомуObjectдолжен соответствовать (поскольку он является родителемNumber), аIntegerне должен. По какой-то причине это происходит наоборот. -
Если у нас есть следующий код
static void test(List<? super Number> param) { param.add(new Integer(2)); } public static void main(String[] args) { ArrayList<String> sList = new ArrayList<String>(); test(sList); //will never compile, however... }Невозможно скомпилировать приведенный выше код (и мое здравомыслие предполагает, что это правильное поведение), но основная логика может доказать обратное:
String is Object, Object is superclass of Number. So String should work.Я знаю, что это безумие, но разве это не причина, по которой они не допускали конструкций
<S super T>? Если да, то почему<? super T>разрешено?
Может ли кто-нибудь помочь мне восстановить недостающую часть этой логической цепочки?