Проблемы с передачей объекта с несколькими типами переменных в arrayylist в java

Я пытаюсь сохранить объект, созданный из файла, в arrayylist, и у меня проблемы с тем, чтобы сделать именно это в программе с тремя классами. Я получаю сообщение об ошибке создания конструкторов, но когда я создаю их автоматически, я получаю сообщение об ошибке: Constructor cannot be applied to given types. Я не совсем понимаю, что это значит. Короче - я занимаюсь этим уже несколько часов и не могу понять.

public class Darbuotojas {
    String vardas;
    String pareigos;
    int gm;
    Float atlyginimas;

    public Darbuotojas(String vardas, String pareigos, int gm, Float atlyginimas){
        this.vardas = vardas;
        this.pareigos = pareigos;
        this.gm = gm;
        this.atlyginimas = atlyginimas;
    }
}

Вот код, в котором я читаю файл и пытаюсь поместить объекты Darbuotojas в ArrayList:

public class Viskas extends Darbuotojas{
    String gm1;
    String atlyginimas1;
    ArrayList<Darbuotojas> darbuotojai = new ArrayList<Darbuotojas>();

    public void failas(String fl) throws IOException{
        //Failu nuskaitymas po zodi
        File file = new File(fl);
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
            String line = null;

            while ((line = br.readLine()) != null){
                String [] tokens = line.split("/");
                vardas = tokens[0];
                pareigos = tokens[1];
                gm1 = tokens[2];
                gm = Integer.parseInt(gm1);
                atlyginimas1 = tokens[3];
                atlyginimas = Float.parseFloat(atlyginimas1);
                System.out.print(vardas.toUpperCase() + " ");
                System.out.print(pareigos.toUpperCase() + " ");
                System.out.print(gm + " ");
                System.out.println(atlyginimas);  
                Darbuotojas drb = new Darbuotojas(vardas,pareigos,gm,atlyginimas);
                darbuotojai.add(drb);
                System.out.println(drb);
            }

            br.close();
        }
        catch(FileNotFoundException e){
        }
    }
}

А вот функция главный:

public static void main(String[] args) throws IOException {
    Scanner kb = new Scanner(System.in);
    System.out.println("Iveskite duomenu vailo pavadinima su failo tipu: ");
    String fl = kb.next();

    Viskas ddd = new Viskas();

    ddd.failas(fl);
}

Прошу прощения за то, что все переменные на литовском языке, но я не думаю, что это что-то меняет с точки зрения читаемости кода.

Как в вашем цикле while вы объявляли переменные vardas и pareigos? (в vardas = tokens[0] и pareigos = tokens[1]. А можете ли вы опубликовать полное сообщение об ошибке, чтобы мы могли увидеть, что не так с конструктором?

Al-un 07.10.2018 22:49

Спасибо за ответ, @ AL-un, я не объявлял их внутри цикла, так как я их исключил в классе Darbuotojas. полное сообщение гласит: «construcotr Darbuotojas в классе Darbuotojas не может применяться к данным типам; требуется: String, String, int, Float; найдено: нет аргументов; причина: фактические и формальные списки аргументов различаются по длине».

Dominykas Stonys 07.10.2018 22:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В вашем примере вы создаете экземпляр нового Viskas. Поскольку Viskas расширяет Darbuotojas и не имеет собственного конструктора, конструктор для Darbuotojas вызывается с отсутствующими параметрами. Чтобы решить эту проблему, передайте необходимые параметры при создании нового Viskas:

(String vardas, String pareigos, int gm, Float atlyginimas)

или создайте конструктор без параметров для Darbuotojas.

Привет, @Denis, спасибо за ответ. Когда я создаю конструктор без параметров для Viskas, код не компилируется, и я получаю сообщение об ошибке: «construcotr Darbuotojas в классе Darbuotojas не может применяться к данным типам; требуется: String, String, int, Float; найдено: нет аргументов; причина: фактическая и формальная. списки аргументов различаются по длине ".

Dominykas Stonys 07.10.2018 23:06

В моем первоначальном комментарии была опечатка; Я имел в виду создать конструктор без параметров для Darbuotojas. Отредактировано.

Denis 07.10.2018 23:11
Ответ принят как подходящий

У Darbuotojas есть определенный конструктор. Viskas расширяет Darbuotojas, но не вызывает конструктор своего родительского Darbuotojas. Просто создайте конструктор для Viskas и поместите super () вверху.

Привет, @Daniel, спасибо за комментарий. Я сделал то, что предлагали вы и @Denis, и, похоже, теперь он компилируется. Спасибо вам, ребята. Но теперь я пытаюсь распечатать ArrayList с помощью System.out.println(Arrays.toString(darbuotojai.toArray()));, и кажется, что где-то все пошло не так, все, что он распечатывает, это «kontras.Darbuotojas@55f96302» для каждого элемента в списке.

Dominykas Stonys 07.10.2018 23:31

Это ожидаемое поведение, потому что вы пытаетесь напечатать объект. Если вам нужно получить некоторую информацию при печати объекта, попробуйте реализовать метод toString () внутри класса Darbuotojas. stackoverflow.com/questions/3615721/…

Rans 08.10.2018 00:21

Может быть, пример поможет лучше объяснить решение. Предположим, у вас есть два класса под названием «Автомобиль» и «Автомобиль». Car расширяет Vehicle, чтобы Car мог унаследовать все функции от Vehicle.

Родительский класс:

public class Vehicle{
    String name;
    int age;
}

Детский класс:

public Class Car extends Vehicle {
 String type;
}

Если у вас нет конструкторов, определенных в классах, он автоматически создаст их внутри, и ниже показано, как это будет выглядеть.

Родительский класс:

public class Vehicle{

    String name;
    int age;

    public Vehicle(){
        super();
    }
}

Детский класс:

public Class Car extends Vehicle {
    String type;

    public Car(){
        Super();
    }
}

Когда у вас есть конструктор, определенный внутри родительского класса, как показано ниже, у него больше не будет конструкторов по умолчанию с пустыми параметрами.

public class Vehicle{

    String name;
    int age;

    public Vehicle(String name, int age){
        this.name = name;
        this.age = age;
    }
}

Итак, если вы попытаетесь создать дочерний класс без определения конструктора, он будет выглядеть, как показано ниже.

public Class Car extends Vehicle {
    String type;

    public Car(){
        Super();
    }
}

Теперь выше будет ошибка компиляции, потому что дочерний класс (Car) пытается вызвать конструктор родительского класса (Vehicle) с пустыми параметрами. Итак, чтобы решить эту проблему, у вас есть два варианта.

Вариант 1. Добавьте в родительский класс пустой конструктор параметров.

public class Vehicle{

    String name;
    int age;

    public Vehicle(){
    }

    public Vehicle(String name, int age){
        this.name = name;
        this.age = age;
    }   
}

Вариант 2. Определите конструктор в дочернем классе, который вызывает конструктор родительского класса.

public Class Car extends Vehicle {
    String type;

    public Car(){
        String defaultName = "";
        int defaultAge = 0;
        Super(defaultName, defaultAge);
    }
}

Другие вопросы по теме