扩展ArrayList并创建新方法

5
我有些困惑 - 我可能完全错了。我正在尝试创建一个扩展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个回答

7

改变

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

为了

public class CustomArrayList extends ArrayList<Item> {

我猜测Item是您想要存储在列表中的类的名称。通过在CustomArrayList后添加<Item>,您引入了一个类型参数,它会遮蔽这个类。 <Item>参数, 使得你的代码等价于:
public class CustomArrayList<T> extends ArrayList<T> {
    // ...
        for (T i : this) { i.getId(); }
    // ...
}

很明显这种方法并不总是有效,因为T可能指代任何类型。


太棒了。这只是正确的语法,还是我试图做其他事情?非常感谢!快速回复。 - Cody
1
那很可能是你的情况下正确的语法。更新了答案以解释为什么。 - aioobe
1
谢谢!讲得非常清楚。 - Cody
另外,如果您想支持具有公共超类型“Item”的各种元素类型,请使用public class ItemArrayList<T extends Item> extends ArrayList<T> { ... } - Dilum Ranatunga

2

getId()是什么?大概它是某个类中的一个方法,但我们不知道是哪个类。

如果你实际上有一个名为Item且具有getId()方法的类,这意味着你需要停止使你的类成为通用类。因此,你需要改为:

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

you want:

public class CustomArrayList extends ArrayList<Item> {

目前在你的类中,Item并不是指一个名为Item的类,它指的是一个叫做类型参数Item

就我个人而言:

  • 除非你真的必须要创建单例,否则我不会避免创建单例
  • 如果你必须要创建单例,我会避免使用你当前的方式(这种方式不是线程安全的)
  • 我不会扩展ArrayList<>,除非我真的必须这样做,更喜欢组合而不是继承

我正在创建一个单例,因为我只能有一个实例。我知道我创建的方式不是线程安全的 - 我需要有一个“锁方法”,对吗?aioobe发布的内容解决了我的问题,但我仍然有兴趣创建一个线程安全的单例。 - Cody
1
在Java 1.5+中创建单例的首选方法是使用枚举。例如,请参见此问题:https://dev59.com/4HVD5IYBdhLWcg3wJIEK - aioobe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接