本次博客开启新的一章的学习,带领大家学习泛型的理解和好处。
- 看一个需求
- 请编写程序,在ArrayList中,添加3个Dog对象;
- Dog对象含有name和age,并输出name和age(要求使用getXXX())。
先使用传统的方法来解决 --> 引出泛型
public class Generic01 {
public static void main(String[] args) {
//使用传统方法来解决
ArrayList arrayList = new ArrayList();
arrayList.add(new Dog("旺财",10));
arrayList.add(new Dog("发财",1));
arrayList.add(new Dog("小黄",5));
arrayList.add(new Cat("招财猫",8));
//遍历
for (Object o :arrayList) {
Dog dog = (Dog) o;
System.out.println(dog.getName()+"--"+dog.getAge());
}
}
}
class Dog{
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Cat{
private String name;
private int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 使用传统方法的问题分析
- 不能对加入到集合ArrayList中的数据类型进行约束(不安全)。
- 遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响。
public class Generic02 {
public static void main(String[] args) {
/*
1.当我们 ArrayList<Dog> 表示存放到 ArrayList 集合中的元素是Dog类型
2.如果编译器发现添加的类型,不满足要求,就会报错
3.在遍历的时候,可以直接取出 Dog类型而不是Object
*/
ArrayList<Dog> arrayList = new ArrayList<Dog>();
arrayList.add(new Dog("旺财",10));
arrayList.add(new Dog("发财",1));
arrayList.add(new Dog("小黄",5));
//arrayList.add(new Cat("招财猫",8));
System.out.println("======使用泛型=====");
for (Dog dog : arrayList) {
System.out.println(dog);
}
}
}
-
泛型的好处
-
编译时,检查添加元素的类型,提高了安全性。
-
减少了类型转换的次数,提高效率。
-
不使用泛型
Dog -加入- > Object -取出- >Dog //放入到ArrayList 会先转成Object,在取出时,还需要转换成Dog。
-
使用泛型
Dog -> Dog -> Dog //放入时,和取出时,不需要类型转换,提高效率
-
-
不再提示编译警告。
-