Так вот, обучение надо было начинать с этого: создавая универсальный метод, после объявления его модификатора доступа обязательно надо указывать объявление типа(ов) в угловых скобках <T > (или <K, V>, если их несколько) — это как введение сигнала компилятору, что внутри метода ты собираешься работать с этими обобщёнными типами. Без этого компилятор не поймёт, что такое T, и выкинет ошибку.
То есть правильный порядок такой:
[модификатор доступа] <тип-параметры> [возвращаемый тип] [имя метода](...)
Пример:
public static <T> ArrayList<T> newArrayList(T... elements) { ... }
Здесь <T> — объявление универсального типа для этого метода, `ArrayList<T>` — возвращаемый тип, а дальше параметры метода.
Это фундаментальная часть синтаксиса дженериков, без которой невозможно создать универсальный метод.
Набор рекомендаций от Oracle о том, когда какие обозначения лучше использовать в дженериках. Вот они:
E — element, для элементов параметризованных коллекций;
K — key, для ключей map-структур;
V — value, для значений map-структур;
N — number, для чисел;
T — type, для обозначения типа параметра в произвольных классах;
Это из-за строчки 32 : "LinkedHashMap mapFromSolution2 = (LinkedHashMap) solution2.getMap(); //need to cast :("
Тут в явную указано, что используется приведение типов. После использования джинериков, можно убрать "(LinkedHashMap)"
PS убрать можно из-за строки выше "Solution<LinkedHashMap> ...."
Эта задача похожа на пример в начале лекции про воинов
По третьей задаче ничего не понял. Смысл параметризации(ограничения типа) аррэйлиста, если можно сделать newArrayList(1,"2a", new Object()); и программа это хавает
в таком случае настойчиво рекомендую, а вернее даже обязываю посмотреть первую, а затем вторую часть данного видео (по ссылке первая часть). Во второй части очень хорошо объясняют зачем так делать. Иначе потом в будущем будут большие проблемы с кодом, которые касаются коллекций работающих даже не то чтобы с дженеризированным типом, а просто даже с коллекциями в которых лежат помимо вашего класса еще и его потомки.
разъяснение третьей задачи
Will Fight, да, так схавает, потому что стираются типы. Написать нужно к примеру:
ArrayList<String> list = newArrayList(1,"2a", new Object());
Тут сразу компилятор выругается и засветится красным. Дженерики выявляют ошибки на этапе компиляции, чтобы потом не искать их в рантайме, собственно об этом задача и была.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ