我写了一个继承于ArrayList的类是该种List可以保持对象类型,然后打算测试一下,用非该种型别的东西add到List中是否可以通过编译,结果出了个很头疼的问题。运行结果出来n多行 at GoodsList.<init>(GoodsList.java:4)。希望高手告知问题在哪.
3个class代码如下
Goods.javaclass Goods{
private int num;

Goods(){
int num = 0;
}
Goods(int num){
this.num = num;
}

public int getNum(){
return num;
}
public void setNum(int i){
this.num = i;
}
}
GoodsList.javaimport java.util.*;class GoodsList extends ArrayList{
private GoodsList list = new GoodsList();


public boolean add(Goods good){
return list.add(good);
}

public Goods get(int index){
return(Goods)list.get(index);
}

public int size(){
return list.size();
}
}
最后是测试程序:ListTest.javaimport java.util.*;class Air{
static final String info = "There's nothing but Air!";  
}public class ListTest{

public static void main(String[] args){
Goods g1 = new Goods();
Goods g2 = new Goods(7);
System.out.println("g1.num = " + g1.getNum());
System.out.println("g2.num = " + g2.getNum());
g1.setNum(12);
System.out.println("After run method setNum, g1.num = " + g1.getNum());

Air a = new Air();
GoodsList gList = new GoodsList();
gList.add(g1);
gList.add(g2);
//if(gList.add(a))
//System.out.println("The fake goods is in the list.");


}
}

解决方案 »

  1.   

    class GoodsList extends ArrayList{
        private GoodsList list = new GoodsList();
        这句话就能导致内存溢出!
    }
    改为:
    private static GoodsList list = new GoodsList();
      

  2.   

    sorry,大意了!class GoodsList {    private  List list = new ArrayList();
        
        
        public boolean add(Goods good){
            return list.add(good);
            }
            
        public Goods get(int index){
            return(Goods)list.get(index);
            }
            
        public int size(){
            return list.size();
            }
        }
      

  3.   


    或者这样也行:class GoodsList extends ArrayList{    public boolean add(Goods good){
            return super.add(good);
            }
            
        public Goods get(int index){
            return(Goods)super.get(index);
            }
            
        public int size(){
            return super.size();
            }
        }
      

  4.   

    一个类的内部一般不要包含自身的实例字段,否则,在构造这个类的实例的时候,执行构造方法之前,会首先构造实例字段,接着又会执行构造函数,无穷递归,导致堆栈溢出(不好意思,上面说错了,说成内存溢出了)!
    class A{
       private A a = new A();
    }
      

  5.   


    我一开始是这么写的,但提示我:GoodsList.java 使用了未经检查或不安全的操作,要了解详细信息,请使用 -Xlint:unchecked 重新编译。所以瞎改了一下。但你提供的方法编译后,依然显示同样的提示信息。
    是因为覆盖的add方法指定了具体类型么?import java.util.*;class GoodsList extends ArrayList{    private  List list = new ArrayList();
        
        
        public boolean add(Goods good){
            return list.add(good);
            }
            
        public Goods get(int index){
            return(Goods)list.get(index);
            }
            
        public int size(){
            return list.size();
            }
        }
      

  6.   


    import java.util.*;class GoodsList extends ArrayList{    private  List list = new ArrayList();
        
        
        public boolean add(Goods good){
            return list.add(good);
            }
            
        public Goods get(int index){
            return(Goods)list.get(index);
            }
            
        public int size(){
            return list.size();
            }
        }
    你的这种写法是有问题的,不是说不能运行!
    本身继承了ArrayList,就用不着再组合一个ArrayList对象了,没有必要。
    你看看我在3楼和4楼给你的代码。
    编译出现警告是因为泛型的原因,如果你仅仅是为了限制元素的类型,使用泛型就可以了
    List<String> list=new ArrayList<String>();
    这样就只能添加进去String,其他的都添加不进去。除非是故意捣乱,用反射。