在Java中将具有多个变量类型的对象传递到arraylist时遇到麻烦

时间:2018-10-07 20:40:35

标签: java class arraylist methods constructor

我试图将由文件创建的对象保存到arraylist中,而在三类程序中很难做到这一点。我收到一条告诉我创建构造函数的错误消息,但是当我自动创建它们时,出现一条错误消息: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){
        }
    }
}

这是 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 :(得分:0)

在您的示例中,您将实例化一个新的Viskas。由于Viskas扩展了Darbuotojas并且没有自己的构造函数,因此Darbuotojas的构造函数将使用缺少的参数来调用。要解决此问题,请在创建新的Viskas时传递所需的参数:

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

或为Darbuotojas创建无参数的构造函数。

答案 1 :(得分:0)

Darbuotojas具有定义的构造函数。 Viskas扩展了Darbuotojas,但并未调用其父级Darbuotojas的构造函数。只需为Viskas创建一个构造函数,然后将super()放在顶部。

答案 2 :(得分:0)

也许一个例子有助于更好地解释该解决方案。假设您有两个类,分别称为Vehicle和Car。 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);
    }
}