【问题标题】:Having troubles of passing an object with multiple variable types into arraylist in java将具有多种变量类型的对象传递到java中的arraylist时遇到麻烦
【发布时间】:2019-03-12 13:27:55
【问题描述】:

我正在尝试将一个从文件创建的对象保存到一个数组列表中,但在三类程序中执行此操作时遇到了麻烦。我收到一条错误消息,告诉我创建构造函数,但是当我自动创建它们时,我收到一条错误消息: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);
}

我很抱歉所有变量都是立陶宛语,但我认为它不会改变任何代码可读性。

【问题讨论】:

  • while 循环中,您是如何声明vardaspareigos 变量的? (在vardas = tokens[0]pareigos = tokens[1] 中。您能否发布完整的错误消息,以便我们查看构造函数有什么问题?
  • 感谢您的回答,@AL-un,我没有在循环中声明它们,因为我在“Darbuotojas”类中对它们进行了处理。完整消息为:“ Darbuotojas 类中的 construcotr Darbuotojas 不能应用于给定类型;必需:String、String、int、Float;发现:无参数;原因:实际参数列表和形式参数列表的长度不同。”

标签: java class arraylist methods constructor


【解决方案1】:

也许一个例子有助于更好地解释解决方案。假设您有两个名为 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);
    }
}

【讨论】:

    【解决方案2】:

    Darbuotojas 有一个已定义的构造函数。 Viskas 扩展了 Darbuotojas,但它不调用其父 Darbuotojas 的构造函数。只需为 Viskas 创建一个构造函数并将 super() 放在顶部即可。

    【讨论】:

    • 嗨,@Daniel,感谢您的评论。我按照你和@Denis 的建议做了,现在似乎可以编译了。谢谢你们。但现在我试图用System.out.println(Arrays.toString(darbuotojai.toArray())); 打印出 ArrayList 并且似乎在某个地方都出错了,它打印出来的只是列表中每个项目的“kontras.Darbuotojas@55f96302”。
    • 这是预期的行为,因为您正在尝试打印对象。如果您在打印对象时需要获取一些信息,请尝试在 Darbuotojas 类中实现 toString() 方法。 stackoverflow.com/questions/3615721/…
    【解决方案3】:

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

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

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

    【讨论】:

    • 嗨,@Denis,谢谢你的回答。当我为 Viskas 创建无参数构造函数时,代码无法编译并且出现错误:“Darbuotojas 类中的 contrucotr Darbuotojas 不能应用于给定类型;必需:String、String、int、Float;发现:无参数;原因:实际和正式参数列表的长度不同。”
    • 我原来的评论有错字;我的意思是为Darbuotojas 创建一个无参数构造函数。已编辑。
    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 2012-10-19
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多