package com.javarush.task.task10.task1015;
import java.io.IOException;
import java.util.ArrayList;
/*
Массив списков строк
*/
public class Solution {
public static void main(String[] args) throws IOException {
ArrayList(String)[] arrayOfStringList = createList();
printList(arrayOfStringList);
}
public static ArrayList(String)[] createList() throws IOException {
ArrayList(ArrayList(String)) mainList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
ArrayList(String) list = new ArrayList<>();
for (int j = 0; j < 5; j++) {
list.add(i + ". number " + i + j);
}
mainList.add(list);
}
/*ArrayList<String>[] array = new ArrayList[mainList.size()]; вот так не проходит
А вот так проходит. Не могу осознать в чем принципиальная разница.
Вывод одинаковый, не принимает только валидатор, ругается на первый пункт. Разница в том, что во втором случае
я явно делаю приведение типа (если я правильно понимаю, но мне не ясно зачем) и явно указываю размер массива
вместо mainList().
*/
ArrayList(String)[] array = (ArrayList(String)[]) new ArrayList[5];
for (int k = 0; k < mainList.size(); k++) {
array[k] = mainList.get(k);
}
return array;
}
public static void printList(ArrayList(String)[] arrayOfStringList) {
for (ArrayList(String) list : arrayOfStringList) {
for (String s : list) {
System.out.println(s);
}
}
}
}
Еще раз. Не могу осознать в чем принципиальная разница. Вывод одинаковый, не принимает только валидатор, ругается на первый пункт. Разница в том, что во втором случае я явно делаю приведение типа (если я правильно понимаю, но мне не ясно зачем) и явно указываю размер массива вместо mainList().gtfo
27 уровень
Объясните разницу, пжлста.
Решен
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #1384518Expert
24 октября 2018, 17:18
Про <>
Инициализация массива
0
gtfo Software Developer
25 октября 2018, 10:47
Спасибо за ссылки, но они никак не помогли. По массивам мне и так все ясно, по дженерикам, конечно, много новой инфы, но тоже не помогло.
Понимаете, программа работает, компилируется и выводит все и с моим вариантом кода, но валидатор пишет, что: "Метод createList должен объявлять и инициализировать массив с типом элементов ArrayList<String>."
И вот тут мне не ясно. Если для idea достаточно, чтобы в размере массива был написан метод и программа работает. И приведение там не нужно, у меня то дженерик указан, то почему валидатор пишет, что я не объявляю и не инициализирую массив?!
Чем эта строка отличается
от этой? Зачем требуется явное указание размера массива?
0
Anonymous #1384518Expert
26 октября 2018, 06:59
Видима про инициализацию массива не читали. Примеры:
И в первой статье было про Diamond способ. Тем более в задании говорится:
"Метод createList должен объявлять и инициализировать массив с типом элементов ArrayList<String>"
Тогда ArrayList(String)[] через круглые скобки не годится. Это устаревший способ.
0
gtfo Software Developer
26 октября 2018, 12:14
Вы же понимаете, что с круглыми скобками ничего не скомпилировалось бы?) Они тут только потому что когда вставляешь код, дженерики съедаются тегами и как будто их вообще нет, поэтому я тут их взял в круглые скобки.
Что в моем варианте не так с инициализацией? Вариант, который принял валидатор, все равно не подпадает под ваши примеры.
У нас с вами где-то недопонимание. Мой вариант, который:
0
Стас ПасинковSoftware Developer в ZipyMaster
26 октября 2018, 12:59
а зачем вы просите помощи по коду, который заведомо написали не так (с другими символами), как у вас в программе? теперь вот непонятно где у вас реальный код, а где вы позаменяли символы
0
gtfo Software Developer
26 октября 2018, 13:17
Я же уже написал зачем. На мой взгляд, очевидно, что дженерики не в круглых скобках. Но если требуется уточнение, повторю:
Почему вот эту строчку валидатор не пропускает:
а вот эту пропускает, хотя вывод у них одинаковый и, на мой взгляд, критичной разницы нет:
по остальной части программы вопросов нет.
0
Стас ПасинковSoftware Developer в ZipyMaster
28 октября 2018, 09:27
ну потому что у вас переменная типизирована, а объект - нет.
вариант попроще будет выглядеть как-то так:
вы тут говорите, что переменная будет ссылаться именно на список строк, а по факту, там лежит список любых объектов. что неправильно.
хотя вывод может быть действительно одинаковым, да :)
0
gtfo Software Developer
28 октября 2018, 12:28
Сейчас же вроде справа дженерик указывать нет необходимости, джава и так понимает, что там будет стринг. Да и, по-моему, пример даже не скомпилируется, если туда попробовать положить что-то отличное от стринга.
Понимаете, я, когда гуглил почему у меня не принимается задача, сначала наткнулся на вот эту конструкцию приведения:
добавил ее в свой код, этого оказалось недостаточно. Пришлось явно указать размер массива - 5, вместо mainList.size(), и только тогда валидатор принял. Но я тогда не догадался попробовать указать только размер массива, а приведение убрать, чтобы точно понять из-за чего это. А сейчас затестил, убрал приведение, но оставил 5 в размере и валидатор принял. Т.е. загвоздка именно в том, что размер был указан через метод mainList.size(). Есть мысли?
0
Pavlo PlynkoJava-разработчик в CodeGymExpert
29 октября 2018, 12:40решение
Валидатор жестко проверяет конструкцию
Постараюсь исправить.
+2
gtfo Software Developer
29 октября 2018, 13:07
Понял, спасибо.
0