我写了一个继承于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.");
}
}
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.");
}
}
private GoodsList list = new GoodsList();
这句话就能导致内存溢出!
}
改为:
private static 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();
}
}
或者这样也行: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();
}
}
class A{
private A a = new A();
}
我一开始是这么写的,但提示我: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();
}
}
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,其他的都添加不进去。除非是故意捣乱,用反射。