泛型和类型安全的容器的基本认知
程序员文章站
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;
}
}
接下来定义一个类为Vegetablepublic 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>();
上一篇: Set和Map数据结构的认知和使用