ArrayList类型安全的容器

ArrayList不使用泛型的情况下,有可能会出现类型安全的问题。因为ArrayList保存的是Object,所以可以将Apple对象和Banana对象放进容器中,当在使用ArrayList的get()方法来取出Apple对象时,得到的只是Object的引用,必须将其转型为Apple,因此,需在调用Apple的id()方法之前,强制进行转型,否则,就会得到编译错误。

public class Apple {
	private static int counter;
    private final int id = counter++;
    
    public int id(){
        return id;
    }
}
public class Banana {

}
import java.util.ArrayList;

public class AppleOrBanana {
	@SuppressWarnings({"rawtypes","unchecked"})
    public static void main(String[] args) {
		//定义一个ArrayList容器,不指定其类型
		ArrayList apples =new ArrayList();
		for(int i = 0; i < 3; i++)
			{
				apples.add(new Apple());
			}
		
		apples.add(new Banana());
		
		//以上代码运行后会出现apples容器中存在了4个对象,其中前面三个为
		//Apple类型,后面一个为Banana类型
		for (int i = 0; i < apples.size(); i++) 
			{
			 //get()方法取值时, 得到的只是Object的引用, 必须将其强制转型为Apple, 否则编译错误
			 //当试图将Banana对象转型为Apple时, 发生类型转换异常
		     System.out.println(((Apple)apples.get(i)).id());
		    }
	}
}

刚才声明容器时没有预先定义类型,默认为Object,现在使用预定义泛型,可以发现定义了容器类型后,编译器可以阻止将Orange放置到apples中,因为此时Banana对象的类型与容器类型不匹配,发生编译错误;另外,将元素从容器中取出时,类型转换也不再时必须的了,因为容器知道自己保存的是什么类型,因此会在调用get()时帮忙转型。

import java.util.ArrayList;

public class AppleOrBanana2 {
	public static void main(String[] args) {
		//定义一个保存Apple对象的ArrayList, 尖括号括起来的是类型参数
        //它指定了这个容器示例可以保存的类型, 通过使用泛型, 就可以在编译器放置将错误类型的对象放置到容器中
        ArrayList<Apple> apples = new ArrayList<Apple>();
        for (int i = 0; i < 3; i++) {
            apples.add(new Apple());
        }
        
        //apples.add(new Banana());  编译器可以阻止将Banana放置到apples中
        
        for (int i = 0; i < apples.size(); i++) {
            System.out.println(apples.get(i).id());
        }
        
        for (Apple c : apples) {
            System.out.println(c.id());
        }
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值