Проблемы с передачей объекта с несколькими типами переменных в arraylist в Java - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь сохранить объект, созданный из файла, в массив, и у меня возникают проблемы с выполнением именно этого в программе из трех классов.Я получаю сообщение об ошибке при создании конструкторов, но когда я автоматически создаю их, я получаю сообщение об ошибке: 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;
    }
}

Вот код, где я читаю файл и пытаюсь поместить Objects 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){
        }
    }
}

А вот функция main :

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);
}

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

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

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

0 голосов
/ 08 октября 2018

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

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

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);
    }
}
0 голосов
/ 08 октября 2018

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

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

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

...