欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-28 17:36:16
...

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>();



相关标签: 泛型