扩展ArrayList并创建新方法

时间:2011-06-29 17:19:08

标签: java arraylist extend

我在抓东西方面遇到了一些问题 - 我可能会对此完全错误。

我正在尝试创建一个扩展ArrayList的类,但有几个方法可以增加功能(至少对于我正在开发的程序。)

其中一个方法是findById(int id),它在每个ArrayList对象中搜索特定的id匹配。到目前为止它正在运作,但它不会让我做for (Item i : this) { i.getId(); }

我不明白为什么?

完整代码:

public class CustomArrayList<Item> extends ArrayList<Item> {

    // declare singleton instance
    protected static CustomArrayList instance;

    // private constructor
    private CustomArrayList(){
        // do nothing
    }

    // get instance of class - singleton
    public static CustomArrayList getInstance(){
        if (instance == null){
            instance = new CustomArrayList();
        }
        return instance;
    }

    public Item findById(int id){
        Item item = null;
        for (Item i : this) {
            if (i.getId() == id) {
                      // something
         }
        }
        return item;
    }
    public void printList(){
        String print = "";
        for (Item i : this) {
            print += i.toString() + "\n";
        }
        System.out.println(print);
    }
}

2 个答案:

答案 0 :(得分:7)

更改

public class CustomArrayList<Item> extends ArrayList<Item> {

public class CustomArrayList extends ArrayList<Item> {

我怀疑Item是您要在列表中存储的类的名称。在<Item>之后添加CustomArrayList,您将引入一个影响此类的类型参数


使用 <Item>参数,您的代码等于

public class CustomArrayList<T> extends ArrayList<T> {
    // ...
        for (T i : this) { i.getId(); }
    // ...
}

显然不会一直有效,因为T可能会引用任何类型。

答案 1 :(得分:2)

什么是getId()?据推测它是某些类中的一种方法,但我们不知道哪个类。

如果您实际上有一个名为Item的类,其中getId()方法是一个列表,您只需要阻止您的类通用。所以不要这样:

public class CustomArrayList<Item> extends ArrayList<Item> {

你想要:

public class CustomArrayList extends ArrayList<Item> {

目前在您的班级中,Item未引用名为Item的类,它引用名为Item类型参数

现在亲自:

  • 我不会避免创建单身人士,除非你真的必须
  • 如果必须,我会避免以你的方式创建它们(这不是线程安全的)
  • 我不会延伸ArrayList<>,除非我真的不得不,更喜欢构图而不是继承