簡體   English   中英

在Java中將具有多個變量類型的對象傳遞到arraylist時遇到麻煩

[英]Having troubles of passing an object with multiple variable types into arraylist in java

我試圖將由文件創建的對象保存到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;
    }
}

這是我讀取文件的代碼,並嘗試將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){
        }
    }
}

這是主要功能:

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

我對立陶宛語中的所有變量感到抱歉,但是我認為它不會改變代碼的可讀性。

在您的示例中,您將實例化一個新的Viskas 由於Viskas擴展了Darbuotojas並且沒有自己的構造函數,因此使用缺少的參數調用Darbuotojas的構造函數。 要解決此問題,請在制作新的Viskas時傳遞所需的參數:

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

或為Darbuotojas創建一個無參數的構造Darbuotojas

Darbuotojas具有定義的構造函數。 Viskas擴展了Darbuotojas,但並未調用其父級Darbuotojas的構造函數。 只需為Viskas創建一個構造函數,然后將super()放在頂部。

也許有一個例子可以幫助更好地解釋解決方案。 假設您有兩個類,分別稱為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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM