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