[英]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.