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

时间:2017-11-08 22:44:41

标签: java inheritance arraylist polymorphism

我正在制作一个包含父类Item的程序,以及子类Game和Album,并且我已经将这些对象存储在一个名为library的类中的类型item的多态arraylist中。

例如,我在游戏的子类中添加了一些变量,当我尝试通过一个名为editAgeRating的方法编辑游戏类特有的变量(称为ageRating)时,使用setter I'我得到一个错误。 eclipse说要在父类中添加方法,当我这样做时,仍然不会覆盖以前的ageRating变量。

我非常确定这是因为我有一个类型项目的arraylist,我试图访问Game类的独特内容,但我不知道知道如何解决它。 (我已经更新了我的帖子,我最初在我的editAgeRating方法中使用了i.getAgeRating(newAgeRating)并且我已将它返回到设置。我正在搞乱它并且我忘了将其更改回来)

非常感谢帮助

我会在下面发布代码

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 个答案:

答案 0 :(得分:0)

我发现您的代码中存在多个问题:

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

2)在editAgeRating方法中,在迭代项目列表时,将每个单独的对象视为一个Item,而不是Game对象。

我认为还存在对多态性的误解。我建议你阅读here

举一个简单的例子,所有动物都“移动”。然而,鸟类飞行,鱼类游动,人类行走,兔子跳跃,即每个动物工具的移动方法都不同,尽管它们都有移动方法。

干杯。

修改

这个问题可能有多个解决方案。这是一对夫妇:

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

2)定义一个具有editAgeRating方法的接口。然后让你的Item和Game类实现该接口。