泛型和类型安全的容器的基本认知

Java对泛型和安全容器的基本认知用下面代码来表示:

首先定义一个类为fruit

 
 
public class Fruit {

	private static int id;
//	定义成静态的,不用每次实例化的时候都开辟一块内存空间,直接用即可
	private final int count = id++;
	
	public int id() {
		System.out.println("count=" + count);
		return count;
	}
}
接下来定义一个类为Vegetable
public class Vegetable {

}
再定义一个main方法类

public class FruitAndVegetable {

	public static void main(String[] args) {
		ArrayList fruit = new ArrayList(); // 不加泛型默认都是object类型的
		for(int i = 0;i < 10;i++) {
			fruit.add(new Fruit()); 
			//在一个容器中,可以理解为盘子,在这个盘子中放入水果,这个盘子默认是什么都能放的盘子
		}
		fruit.add(new Vegetable());//在容器中放入蔬菜
		for(int i = 0;i < fruit.size();i++) {
//			把放进去的实例(水果、蔬菜)进行遍历
			((Fruit)fruit.get(i)).id(); //默认取出来是object类型,需要把它转换成你想要的Fruit类型
		}
	}
输出:

count=0

count=1

count=2

count=3

count=4

count=5

count=6

count=7

count=8

count=9

Exception in thread "main" java.lang.ClassCastException: test.Vegetable cannot be cast to test.Fruit

at test.FruitAndVegetable.main(FruitAndVegetable.java:16)


为什么会报错呢?

因为你盘子中放的是Fruit 和 Vegetable ,但是这两者没有任何关系,你只把它转化成Fruit,vegetable类型是不安全的,vegetable类型无法转化为Fruit类型,所以会报错,解决上述问题,只要让他们发生关系即可

解决方法1:

public class Vegetable extends Fruit{

}

只要让Vegetable继承Fruit即可解决

解决方法2:

只要把上述Object类型的盘子转换为只能放Fruit类型的盘子即可

ArrayList<Fruit> fruit = new ArrayList<Fruit>();



猜你喜欢

转载自blog.csdn.net/qq_36894974/article/details/79098940