#java #generics
Коллекция List(как и List) позволит мне добавлять элементы порожденных классов от someType. List (как и List ) будет возвращать элемент типа someType при вызове метода get(). В чем же между ними разница?
Ответы
Ответ 1
Классы Double и Integer наследуется от Number. ListdoubleList = new ArrayList (); List integerList = new ArrayList (); List numberList = new ArrayList (); public static void doSomething1(List list) { // ... } public static void doSomething2(List list) { // ... } doSomething1(numberList); // ok doSomething1(doubleList); // ok doSomething1(integerList); // ok doSomething2(numberList); // ok doSomething2(doubleList); // ошибка компиляции doSomething2(integerList); // ошибка компиляции Еще пример: List doubleList = new ArrayList (); doubleList.add(1.2); List numberList = doubleList; // ошибка компиляции List numberList = (List )doubleList; // ошибка компиляции List numberList = doubleList; // ok Number number = numberList.get(0); // 1.2 Ответ 2
Положим, что DerivedType extends BaseType. В таком случае Listявляется подтипом List, но не является подтипом List . Когда вы объявляете переменную типа List , вы говорите, что список содержит или SomeType, или производные от него. Вы можете положить в список переменную любого типа, унаследованного от SomeType или самого его. Когда вы объявляете переменную типа List, вы говорите, какой тип списка переменная может содержать. Вы не можете просто взять и положить элемент типа SomeType в такую переменную, потому что с точки зрения компилятора список может оказаться и списком List . См. Generics : List is same as List ?
Комментариев нет:
Отправить комментарий