Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115

Метод addAll ArrayList

02.11.2017, 19:03. Показов 1673. Ответов 3

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть базовый класс в 4 полями,а так же дочерний класс с 2мя.Я хочу передать несколько объектов базового класса(в каждом базовом классе содержится поле ArrayList,которое содержит общее количество элементов у данного объекта) в дочерний класс.
Использую конструктор ChildClass(ArrayList...argv)
Java
1
2
3
4
5
6
7
8
9
10
11
        ChildClass(ArrayList...argv){
            for(int index = 0;index < argv.length ; index++) {
                List.add(new ArrayList<ChildClass>());
                List.get(index).addAll(index,argv[index]);
                for(int i =0;i<List.get(index).size();i++)
                {
                    List.get(index).get(i).money = 0.0;//Здесь возникает ошибка
                    List.get(index).get(i).SpendFuel = 0.0;
                }
            }
        }
В общем я думаю,что происходит сужение в процессе добавления объекта базового класса в ArrayList дочернего класса,т.е. List хранит 4 поле,а когда я хочу добавить значение в 5 и 6 поля,то Возникла ошибка java.lang.ClassCastException.

Вопрос:"Как сделать корректное преобразование?"
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.11.2017, 19:03
Ответы с готовыми решениями:

Как вернуть значение(вызвать метод) из Arraylist
Здравствуйте! Требуется посчитать количество элементов ArrayList, у которых значения переменной равно botType &quot;Retention&quot;. ...

Для чего написано: ArrayList<person> people = new ArrayList<>();
package com.company; import java.util.ArrayList; import java.util.Iterator; public class Main { public static void...

Передача ArrayList в качестве параметра методу, и в дальнейшем получение свойств объектов которые хранятся в ArrayList
Всем привет. Задача следующая: a. Есть классы Fruit -&gt; Apple, Orange;(больше фруктов не надо) b. Класс Box в который можно складывать...

3
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
02.11.2017, 22:02
Поподробнее опиши что ты хочешь. Не понял я по коду. И что у тебя за переменная List в методе? Откуда она?
И кода больше. Что за классы и какие в них поля
0
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
04.11.2017, 06:27  [ТС]
ArtemFM,
Цитата Сообщение от ArtemFM Посмотреть сообщение
что хочешь
Идея такая: В базовом классе хранятся данные о клиентах ( ФИО,Номер машины, Название станции,Адрес станции) , в дочернем классе должны хранится эти же данные,только расширенные(Цена на бензин , Количество потраченного бензина).
Чтобы заного не вводить данные с нуля,я хочу их передать в дочерний класс. Проблема возникает в присваивании базового класса дочернему.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
import java.util.Scanner;
import java.util.ArrayList;
import java.lang.String;
import java.lang.*;
 
class CarServisJobOrders
{
    public String FullName;
    public String LicensPlate;
    public String NameShop;
    public String AddressShop;
    ArrayList<CarServisJobOrders> List  = new ArrayList<>();
    CarServisJobOrders(String FullName,String LicensPlate,String NameShop, String AddressShop)
    {
        if(!checkLicensPlate(LicensPlate))
            throw new ExceptionInInitializerError("Error!Unknown LicensPlate!");
        if(FullName.isEmpty() || LicensPlate.isEmpty() || NameShop.isEmpty() || AddressShop.isEmpty())
            throw new ExceptionInInitializerError("Initialization error! (Empty string)");
        this.FullName = FullName;
        this.LicensPlate = LicensPlate;
        this.NameShop = NameShop;
        this.AddressShop = AddressShop;
        List.add(new CarServisJobOrders(this.FullName,this.LicensPlate,this.NameShop,this.AddressShop));
    }
    public void setFullName(int ID,String FullName){
        if(List.size()-1<ID)
        List.add(new CarServisJobOrders());
        List.get(ID).FullName = FullName;
    }
    public void setLicensPlate(int ID,String LicensPlate){
        if(!checkLicensPlate(LicensPlate))
            throw new ExceptionInInitializerError("Error!Unknow LicensPlate!");
        if(List.size()-1<ID)
            List.add(new CarServisJobOrders());
        List.get(ID).LicensPlate = LicensPlate;
    }
    public void setNameShop(int ID,String NameShop){
        if(List.size()-1<ID)
            List.add(new CarServisJobOrders());
        List.get(ID).NameShop = NameShop;
    }
    public void setAddressShop(int ID,String AddressShop){
        if(List.size()-1<ID)
            List.add(new CarServisJobOrders());
        List.get(ID).AddressShop = AddressShop;
    }
 
    public void PrintAll() {
        if(List.size() == 0)
            System.err.println("Not found elements");
        for (int i = 0; i < List.size(); ++i) {
            System.out.println("F.I.O. : "+ getFullName(i));
            System.out.println("Licens Plate : " + getLicensPlate(i));
            System.out.println("Name Shop: "+ getNameShop(i));
            System.out.println("Address Shop: " + getAddressShop(i)+"\n");
        }
    }
    public boolean checkLicensPlate(String LicensPlate){
 
        if(LicensPlate.length() != 6)
            return false;
        if(Character.isDigit(LicensPlate.charAt(0)))//Character.isDigit определяет, является ли указанное значение типа char цифрой.
            return false;
        if(!Character.isDigit(LicensPlate.charAt(1)))
            return false;
        if(!Character.isDigit(LicensPlate.charAt(2)))
            return false;
        if(!Character.isDigit(LicensPlate.charAt(3)))
            return false;
        if(Character.isDigit(LicensPlate.charAt(4)))
            return false;
        if(Character.isDigit(LicensPlate.charAt(5)))
            return false;
        return true;
    }
    public int input(Scanner in) {
        int numberClient = 0;
        boolean flag = false;
        String Fio = "";
        String Plate = "";
        String NameShop = "";
        String AddressShop = "";
        do {
            System.err.println("Information about clients:");
 
            System.err.print("Enter Full Name client: ");
            do {
                Fio = in.nextLine();
            } while(Fio.isEmpty());
 
            do {
                System.err.print("Enter the customer's license plate: ");
                Plate = in.nextLine();
            } while(Plate.isEmpty() || !checkLicensPlate(Plate));
 
            do {
                System.err.print("Enter Name Shop : ");
                NameShop = in.nextLine();
            } while(NameShop.isEmpty());
 
            do {
                System.err.print("Enter Address Shop: ");
                AddressShop = in.nextLine();
            } while(AddressShop.isEmpty());
 
 
            setFullName(numberClient,Fio);
            setLicensPlate(numberClient,Plate);
            setNameShop(numberClient,NameShop);
            setAddressShop(numberClient,AddressShop);
            numberClient++;
            String continuewrite = "";
            System.err.println("Would you like to continue typing??(Y/N) ");
            continuewrite = in.nextLine();
            if (continuewrite.equals("Y")) {
                flag = false;
            } else {
                flag = true;
            }
        } while(!flag);
 
        return numberClient;
    }
public static class GasStation extends CarServisJobOrders{
        public double money;//Деньги за топливо
        public double SpendFuel;//Потраченное топливо(литры)
        public ArrayList<ArrayList<GasStation>> List = new ArrayList<>();
 
        GasStation(ArrayList<CarServisJobOrders> list){
 
        }
        GasStation(ArrayList...argv){
            for(int index = 0;index < argv.length ; index++) {
                ArrayList<GasStation> buf = new ArrayList<>();
                buf.addAll(new ArrayList<GasStation>(argv[index]));
                List.add(index, buf);
                for(int i =0;i<List.get(index).size();i++)
                {
                    List.get(index).get(i).money = 0.0;
                    List.get(index).get(i).SpendFuel = 0.0;
                }
            }
        }
 
public static void main (String[] args) {
        try {
 
            int i = 10;
            String a = "s";
            CarServisJobOrders CustomersOfTheFirstGasStation = new CarServisJobOrders();
            CarServisJobOrders CustomersOfTheSecondGasStation = new CarServisJobOrders();
            CarServisJobOrders CustomersOfTheThirdGasStation = new CarServisJobOrders();
 
            GasStation gasStations = new GasStation();
 
            Scanner in = new Scanner(System.in);
            int number = 0;
 
 
            ArrayList<String> Main = new ArrayList<>();
            boolean flag = false;
            do{
                Main.add("Main menu:");
                Main.add("1)Input information about clients");
                Main.add("2)Get the maximum and minimum number of orders for clients");
                Main.add("3)Get information about one client");
                Main.add("4)Get information abount clients refueling at the station");
                Main.add("5)Get information about all clients");
                Main.add("6)Sort the information about the customers of one filling station");
                Main.add("7)Sort customer information for all gas stations");
                Main.add("8)To find out information about the profit from one gas station");
                Main.add("9)To find out information about the profit from all gas stations");
 
 
                for(int str = 0;str<Main.size();str++)
                    System.err.println(Main.get(str));
                do {
                    System.err.println("Enter the number of the operation to perform (1-"+ (Main.size()-1) +"): ");
                    number = in.nextInt();
                } while(number <1 || number > Main.size()-1);
 
                String continuewrite ="";
                switch(number) {
                    case 1:
                        CustomersOfTheFirstGasStation.input(in);
                        //CustomersOfTheSecondGasStation.input(in);
                        //CustomersOfTheThirdGasStation.input(in);
                        gasStations = new GasStation(CustomersOfTheFirstGasStation.List,CustomersOfTheSecondGasStation.List,CustomersOfTheThirdGasStation.List);
                        break;
                }
                do {
                    System.err.println("You want contniue write? Y/N");
                    continuewrite = in.nextLine();
                }while(continuewrite.isEmpty());
                if(continuewrite.equals("Y"))
                    flag = false;
                else
                    flag = true;
            }while(!flag);
        }
        catch(ExceptionInInitializerError e)
        {
            System.err.print(e.getMessage());
        }
    }
}
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
07.11.2017, 03:57
1. Ты не можешь перекастовать родителя к наследнику, только наследника к родителю, т.к. родитель ничего не значет о наследнике, а наследник знает.
2. Зачем тебе вообще родитель с 4-мя полями, а наследник с + 2 полями, почему не обойтись одним классом с 6-тью полями и если не нужно, то 2 не заполнять?!
3. вообще я бы разделил класс-шаблон для хранения и класс хранения... Поясню:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class BaseA {
    private List<A> list = new ArrayList<>();
 
    public void add(String name, String numberCar, String nameGasStation, String addressGasStation) {
        list.add(new A(name, numberCar, nameGasStation, addressGasStation));
    }
 
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        if (this.list.size() != 0) {
            for (A a : this.list) {
                if (a != null) {
                    sb.append(a).append(System.lineSeparator());
                }
            }
        }
        return sb.toString();
    }
}
 
class A {
    String name;
    String numberCar;
    String nameGasStation;
    String addressGasStation;
 
    //геттеры и сеттеры
 
    public A(String name, String numberCar, String nameGasStation, String addressGasStation) {
        this.name = name;
        this.numberCar = numberCar;
        this.nameGasStation = nameGasStation;
        this.addressGasStation = addressGasStation;
    }
 
    @Override
    public String toString() {
        return String.format("%s, %s, %s, %s;", this.name, this.numberCar, this.nameGasStation, this.addressGasStation);
    }
}
4. метод public boolean checkLicensPlate(String licensPlate) я бы сократил вот до такого:
Java
1
2
3
public static boolean checkLicensePlate(String value) {
        return value != null && value.length() == 6 && value.replaceAll("\\d", "").length() == 0;
    }
5. проверял бы LicensePlate не в конструкторе и методах класса, а при вводе с консоли или сразу после ввода
6. не стоит в конструкторе класс проводить такие операции, как выброс ексепшена или проверки... Лучше данные также проверить при вводе или после

7. По идее у тебя должна быть логика программы такая
- создаёшь класс-шаблон с нужными полями и геттерами и сеттерами...
- создаёшь класс для хранения классов-шаблонов с ArrayList<Класс-шаблон> и набором методов для добавления, удаления печати и т.д.. В общем со всем, что тебе нужно
- абстрактный класс MenuAction и классы-наследники:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class SimpleClass {
    private static List<MenuAction> menus = new ArrayList<>();
 
    public static void main(String[] args) {
        fillMenu();
        printMenu();
    }
 
    public static void fillMenu() {
        menus.add(new MenuPrintAll(1, "Print all values to console"));
        menus.add(new MenuExit(1, "Exit program"));
    }
 
    public static void printMenu() {
        for (MenuAction menu : menus) {
            System.out.println(menu);
        }
    }
}
 
abstract class MenuAction {
    private int key;
    private String name;
 
    public MenuAction(int key, String name) {
        this.key = key;
        this.name = name;
    }
 
    public int getKey() {
        return key;
    }
 
    @Override
    public String toString() {
        return String.format("%s. %s;", this.key, this.name);
    }
 
    abstract void execute();
}
 
class MenuPrintAll extends MenuAction {
    public MenuPrintAll(int key, String name) {
        super(key, name);
    }
 
    @Override
    void execute() {
        //тут выводим все данные нашей базы на экран
    }
}
 
class MenuExit extends MenuAction {
    public MenuExit(int key, String name) {
        super(key, name);
    }
 
    @Override
    void execute() {
        System.exit(0);
    }
}
8. работа с листом менюшек в отдельном классе, где был бы метод заполнения меню, печати меню и работы с меню (цикл по кругу, пока пользователь не выйдет из программы)

9. Класс с набором методов получения данных с консоли

10. в классе с точкой входа программы (класс с методом main) минимум кода. Создать лишь объекты классов и запуск класса работы с меню

11. да и вообще программа не должна прекращать работу при вводе неправильных данных или выброса ексепшена.
0
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru