Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

В чем разница между `List` и `List`?

#java #generics


Коллекция List (как и List) позволит мне добавлять
элементы порожденных классов от someType.
List (как и List) будет возвращать элемент типа someType
при вызове метода get().

В чем же между ними разница?
    


Ответы

Ответ 1



Классы Double и Integer наследуется от Number. List doubleList = 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?

Комментариев нет:

Отправить комментарий