2 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
您應(yīng)該使用ArrayList<? extends ListItem>而不是ArrayList<ListItem>抽象類(lèi)。
也使用equals字符串比較的方法。
更新
您的抽象類(lèi)應(yīng)如下所示:
abstract class CheckList<T extends ListItem> {
ArrayList<T> items;
ArrayList<T> getItems() { return this.items; }
...
實(shí)施
public class ShoppingList extends CheckList<ShoppingListItem> {
您應(yīng)該確定您的泛型類(lèi)以進(jìn)行嚴(yán)格的類(lèi)使用。
完整清單:
import java.util.ArrayList;
abstract class CheckList<T extends ListItem> {
String name;
ArrayList<T> items;
String getName() { return this.name; }
ArrayList<T> getItems() { return this.items; }
public String setName(String name) { return this.name = name; }
public abstract void addItem(String name);
public boolean editItem(String oldName, String newName) {
for (int i = 0; i < items.size(); i++)
{
if (items.get(i).getName().equals(oldName)) {
items.get(i).setName(newName);
return true; // target found
}
}
return false; // cannot find the target
}
public boolean deleteItem(String name) {
for (int i = 0; i < items.size(); i++)
{
if (items.get(i).getName().equals(name)) {
items.remove(i);
return true; // target found
}
}
return false; // cannot find the target
}
public boolean completeItem(String name) {
for (int i = 0; i < items.size(); i++)
{
if (items.get(i).getName().equals(name)) {
items.get(i).setCompleted(true);
return true; // target found
}
}
return false; // cannot find the target
}
}
class ListItem {
private String name;
private Boolean completed;
public String getName() {
return name;
}
public Boolean getCompleted() {
return completed;
}
public void setName(String name) {
this.name = name;
}
public void setCompleted(Boolean completed) {
this.completed = completed;
}
}
class ShoppingListItem extends ListItem {
public ShoppingListItem(String name) {
this.setName(name);
}
}
public class ShoppingList extends CheckList<ShoppingListItem> {
public ShoppingList (String name) {
this.name = name;
this.items = new ArrayList<>();
}
public void addItem(String name) {
// add a new ShoppingListItem to items
final ShoppingListItem item = new ShoppingListItem(name);
this.items.add(item);
}
}

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
GenericClass<Parent>和之間沒(méi)有繼承關(guān)系GenericClass<Child>,但是有一個(gè)針對(duì)您的情況的解決方案,通配符:
ArrayList<? extends ListItem> items = new ArrayList<>(); //list with wildcard
您將能夠?qū)⑷魏螖U(kuò)展的內(nèi)容ListItem放入其中。
還可以考慮使用 foreach 循環(huán)甚至更好的 lambda 表達(dá)式使循環(huán)更緊湊。例如你的刪除方法:
public boolean deleteItem(String name) {
boolean removed = false;
items.removeIf(item -> {
item.getName().equals(name);
removed = true;
});
return removed;
}
順便說(shuō)一下,您應(yīng)該將字符串與equals方法進(jìn)行比較。
添加回答
舉報(bào)