Я перебирав ці теми
Однак я все ще, здається, збився з 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) { List<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> це дозволено?
Хтось може допомогти мені відновити відсутню частину цього логічного ланцюга?