【问题标题】:"Constructor Album in class Album cannot be applied to different types"“类相册中的构造函数相册不能应用于不同的类型”
【发布时间】:2014-11-05 16:50:02
【问题描述】:

我目前很难编译我的新子类:

public class CompilationAlbum extends Album {

    private String seriesOfAlbums;

    public CompilationAlbum(String seriesOfAlbums) {
        this.seriesOfAlbums = seriesOfAlbums;
        albumType = "Compilation";
    }
}

谁能指出我做错了什么?错误似乎在于构造函数,但我不明白为什么会导致错误。错误消息还显示“实际参数列表和形式参数列表的长度不同。”

编辑:Album 类,减去方法,如下所示:

import java.util.ArrayList;

public class Album {

    private String name;
    private ArrayList<Track> trackList;
    private int length; 
    private int fileSize;
    private double averageRating;
    private String albumType;

    public Album(String name){
        this.name = name;
        trackList = new ArrayList<Track>();
    }

【问题讨论】:

  • 在讨论如何设置名称之后,我不认为私有字段是一个“问题”。假设有公共或受保护的 get/set 方法,通常最好使用这些方法(即 this.setName(name))而不是直接修改字段。在这里查看一些讨论:stackoverflow.com/questions/2279662/…

标签: java


【解决方案1】:

如果您没有在子类构造函数的第一行显式调用超类的构造函数,则编译器会插入对super() 的调用。由于 Album 没有无参数构造函数,编译失败是因为插入的对 super() 的调用无效。

有两种方法可以解决这个问题 - 要么使用一些 String 参数调用现有的超类构造函数(你必须决定什么对你的特定用例有意义),或者向超类添加一个无参数构造函数(再次,此构造函数的行为将取决于您实际尝试执行的操作)。

这是一种可能有意义的方法:

public class CompilationAlbum extends Album {

    private String seriesOfAlbums;

    public CompilationAlbum(String name, String seriesOfAlbums) {
        super(name);
        this.seriesOfAlbums = seriesOfAlbums;
        albumType = "Compilation";
    }
}

【讨论】:

  • 我刚刚编辑了我的帖子以添加相册类(减去方法)。
  • 正确 - 我们就是这么想的。如果您将 CompilationAlbum 构造函数更改为以 super(seriesOfAlbums); 开头,您将修复编译错误。或者,由于这对于您的实际用例可能没有意义,您可以向 Album 添加一个无参数构造函数。
  • 好的,我添加了super(seriesOfAlbums);,现在效果更好了,尽管当albumType 是私有变量时,尝试构造albumType 时仍然收到错误消息。你知道解决这个问题的方法吗,允许子类修改它的超类?
【解决方案2】:

没有看到 Album 的源代码,我猜测它没有默认构造函数。

这是你写的:

public class CompilationAlbum extends Album {

    private String seriesOfAlbums;

    public CompilationAlbum(String seriesOfAlbums) {
        this.seriesOfAlbums = seriesOfAlbums;
        albumType = "Compilation";
    }
}

你想要这个:

public class CompilationAlbum extends Album {

    private String seriesOfAlbums;

    public CompilationAlbum(String seriesOfAlbums) {
        super(seriesOfAlbums);
        this.seriesOfAlbums = seriesOfAlbums;
        albumType = "Compilation";
    }
}

现在我看到Album 类,你的问题是private 成员。制作那些protected,以便孩子们也可以使用它们。

【讨论】:

  • 我刚刚编辑了我的帖子以添加相册类(减去方法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多