Java 扩展ArrayList并创建新方法

Java 扩展ArrayList并创建新方法,java,arraylist,extend,Java,Arraylist,Extend,我在掌握一些东西方面有点问题——我可能完全错了 我试图创建一个扩展ArrayList的类,但有几个方法可以增加功能(至少对于我正在开发的程序是这样) 其中一个方法是findById(int-id),它搜索每个ArrayList对象以查找特定的id匹配。到目前为止,它还在工作,但它不允许我为(Item i:this){i.getId();} 我不明白为什么 完整代码: public class CustomArrayList<Item> extends ArrayList<Ite

我在掌握一些东西方面有点问题——我可能完全错了

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

其中一个方法是findById(int-id),它搜索每个ArrayList对象以查找特定的id匹配。到目前为止,它还在工作,但它不允许我为(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);
    }
}
公共类CustomArrayList扩展了ArrayList{
//声明单例实例
受保护的静态CustomArrayList实例;
//私有构造函数
私有CustomArrayList(){
//无所事事
}
//获取类的实例-singleton
公共静态CustomArrayList getInstance(){
if(实例==null){
实例=新的CustomArrayList();
}
返回实例;
}
公共项findById(int-id){
Item=null;
(第一项:本){
if(i.getId()==id){
//某物
}
}
退货项目;
}
公共作废打印列表(){
字符串打印=”;
(第一项:本){
print+=i.toString()+“\n”;
}
系统输出打印项次(打印);
}
}
更改

public class CustomArrayList<Item> extends ArrayList<Item> {
显然,这并不总是有效的,因为
t
可以引用任何类型。

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

如果您实际拥有一个名为
Item
的类,该类具有
getId()
方法,这意味着它是一个。因此,与此相反:

public class CustomArrayList<Item> extends ArrayList<Item> {
公共类CustomArrayList扩展了ArrayList{
你想要:

public class CustomArrayList extends ArrayList<Item> {
公共类CustomArrayList扩展了ArrayList{
当前在您的类中,
Item
并不是指一个名为Item的类,而是指一个名为
Item
的类型参数

现在我个人:

  • 除非你真的必须这样做,否则我不会避免创造单身
  • 如果必须这样做,我会避免以您现有的方式创建它们(这不是线程安全的)
  • 我不会扩展
    ArrayList
    ,除非我真的必须扩展,我更喜欢组合而不是继承

太棒了。这是正确的语法,还是我在尝试做其他事情?非常感谢!快速回复。这可能是适合您的场景的正确语法。更新了答案以解释原因。谢谢!这解释得很好。要添加到这一点,如果您想用通用超级类型
支持各种元素类型,请使用<代码>公共类ItemArrayList扩展了ArrayList{…}。我创建一个单例的原因是我只能有一个。我知道我创建它的方式不是线程安全的-我需要一个“锁定方法”,对吗?发布的aioobe解决了我的问题,但我仍然对创建线程安全的单例程序感兴趣。在Java 1.5+中创建单例程序的首选方法是使用枚举。例如,请参见以下问题:
public class CustomArrayList<Item> extends ArrayList<Item> {
public class CustomArrayList extends ArrayList<Item> {