当前位置: 首页 > 知识库问答 >
问题:

尝试访问多态数组(java)中子类的方法时发生setter错误

艾飞宇
2023-03-14

我正在制作一个带有父类Item和子类Game和Album的程序,我已经将对象存储在一个名为Library的类中类型为Item的多态arraylist中。

public class Item {

private int id;
private String title;
private String genre;
private int yearReleased;

public Item() {

}

public Item(int id, String title, String genre, int yearReleased) {
    this.id = id;
    this.title = title;
    this.genre = genre;
    this.yearReleased = yearReleased;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getGenre() {
    return genre;
}

public void setGenre(String genre) {
    this.genre = genre;
}

public int getYearReleased() {
    return yearReleased;
}

public void setYearReleased(int yearReleased) {
    this.yearReleased = yearReleased;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((genre == null) ? 0 : genre.hashCode());
    result = prime * result + id;
    result = prime * result + ((title == null) ? 0 : title.hashCode());
    result = prime * result + yearReleased;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Item other = (Item) obj;
    if (genre == null) {
        if (other.genre != null)
            return false;
    } else if (!genre.equals(other.genre))
        return false;
    if (id != other.id)
        return false;
    if (title == null) {
        if (other.title != null)
            return false;
    } else if (!title.equals(other.title))
        return false;
    if (yearReleased != other.yearReleased)
        return false;
    return true;
}

public String toString() {
    return " | ID: " + id + " | Title: " + title + " | Genre:  " + genre + " | Year Released: " + yearReleased; 
}
public class Game extends Item{

private int ageRating;
private String developer;

public Game() {

}

public Game(int id, String title, String genre, int yearReleased, int ageRating, String developer) {

    super(id, title, genre, yearReleased);
    this.ageRating = ageRating;
    this.developer = developer;

    new Library(this);

}

public int getAgeRating() {
    return ageRating;
}

public void setAgeRating(int ageRating) {
    this.ageRating = ageRating;
}

public String getDeveloper() {
    return developer;
}

public void setDeveloper(String developer) {
    this.developer = developer;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = super.hashCode();
    result = prime * result + ageRating;
    result = prime * result + ((developer == null) ? 0 : developer.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (!super.equals(obj))
        return false;
    if (getClass() != obj.getClass())
        return false;
    Game other = (Game) obj;
    if (ageRating != other.ageRating)
        return false;
    if (developer == null) {
        if (other.developer != null)
            return false;
    } else if (!developer.equals(other.developer))
        return false;
    return true;
}

public String toString() {
    return "Game: " + super.toString() + " | Age Rating: " + ageRating + " | Developer: " + developer;
}

}

public class Library {

static ArrayList<Item> itemList = new ArrayList<Item>();

public Library(Item object) {
    itemList.add(object);
}

public static void printItems() {
    for(Item i: itemList) {
        System.out.println(i);
    }
}

public static void removeItem(int id) { 
    for(int i = itemList.size() -1 ; i > -1; i--) { // start backwards as problem removing when looping foreward
        if( id == itemList.get(i).getId() )
            itemList.remove(i);
    }
}

public static void editID(int searchId, int newId) {
    for(Item i: itemList) {
        if( i.getId() == searchId) {
            i.setId(newId);
        }
    }
}

public static void editTitle(int searchId, String newTitle) {
    for(Item i: itemList) {
        if( i.getId() == searchId);
            i.setTitle(newTitle);
    }
}

public static void editGenre(int searchId, String newGenre) {
    for(Item i: itemList) {
        if( i.getId() == searchId);
            i.setGenre(newGenre);
    }
}

public static void editYearReleased(int searchId, int newYearReleased) {
    for(Item i: itemList) {
        if( i.getId() == searchId);
            i.setYearReleased(newYearReleased);
    }
}

public static void editAgeRating(int searchId, int newAgeRating) {
    for (Item i: itemList) {
        if( i.getId() == searchId)
            i.setAgeRating(newAgeRating);
    }
}

}

共有1个答案

刘京
2023-03-14

我看到你的代码中有不止一个问题:

1)在您的editAgeRating方法中,您没有调用setter,但您当前正在调用getter。并且您的类中没有这样的方法(getAgeRating方法采用newAgeRating参数)。您的getter方法不需要参数。这意味着方法签名是不同的。

2)在您编辑方法中,当迭代项目列表时,您将每个单独的对象视为一个项目,而不是一个游戏对象。

1)将Item定义为抽象类,并将editAgeRating方法作为抽象方法添加到该类中。

2)定义一个接口,该接口具有编辑方法,然后使你项目和游戏类实现该接口。

 类似资料:
  • 我有一个具有这种模式的JSON文件: 家庭电话号码数组有时可能为空。 我的spark应用程序收到这些JSON的列表,并执行以下操作: 当“home”数组为空时,我在尝试爆炸它时收到以下错误: 组织。阿帕奇。火花sql。AnalysisException:由于数据类型不匹配,无法解析“[“home]”:参数2需要整数类型,但“home”是字符串类型。;; 如果这个场是空的或是空的,有没有一种优雅的方

  • 尝试启动应用程序时,访问ControllerServlet时出现错误500(HTTP状态500–内部服务器错误),其代码如下所示 错误文本: 类型异常报告 消息[com.example.ControllerServlet] 说明服务器遇到意外情况,无法满足请求。 例外 雅加达。servlet。ServletException:БааС[com.example.ControllerServlet]。

  • 问题内容: 我遇到了一个例外,但找不到原因。 我得到的例外是: :尝试访问方法; 从B类 该方法是公开的。 我正在使用Tomcat 5.5.12和JAVA 1.6 问题答案: 几乎可以肯定,您在运行时使用的类版本与您期望的版本不同。特别是,运行时类将不同于您针对其进行编译的类(否则将导致编译时错误)-该方法曾经存在private吗?您的系统上任何地方都有类/ jar的旧版本吗? 作为状态的java

  • 我得到: 错误:(37,30)Java:无法访问未找到java.util.function.function的java.util.function.function类文件 指向“等待”

  • null 从我的类中调用这些代码的工作方式与我预期的一样。但是,我想在Kotlin子类之外调用其中的一个方法。 如果从不同的Kotlin类尝试,则会出现以下编译错误: 未解析得引用:completeWakefulIntent

  • 我在ReactJS中得到了一个子类和一个父类。我想让我的孩子访问父级的状态,这是每毫秒更新一次。孩子也应该有可能接触到一些父母的方法。 在另一个类中,我正在初始化一个子对象并对其调用Function startManager()。但随后我收到一条错误消息,说无法读取未定义的属性“start”。我是一个新的反应者,我认为我在定义孩子的属性时犯了一些错误。有人知道我做错了什么吗。谢谢