传统方法
- 不能对加入到集合ArrayList中的数据类型进行约束(不安全)
- 遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响 ```java package test;
import java.util.ArrayList; public class Main { 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) {
//向下转型Object ->Dog
Dog dog = (Dog) o;
System.out.println(dog.getName() + "-" + dog.getAge());
}
}
} / 请编写程序,在ArrayList 中,添加3个Dog对象 Dog对象含有name 和 age, 并输出name 和 age (要求使用getXxx()) / 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;
}
}
class Cat { //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;
}
}
![image.png](https://cdn.nlark.com/yuque/0/2021/png/21705001/1639194169214-26d79771-a176-4bbd-8c85-c2cc086eeeff.png#clientId=uf2164b51-22fd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=240&id=u8e2b0707&margin=%5Bobject%20Object%5D&name=image.png&originHeight=240&originWidth=1004&originalType=binary&ratio=1&rotation=0&showTitle=false&size=191872&status=done&style=none&taskId=uccc8314c-b613-4b32-8e04-eef2658d9d8&title=&width=1004)
<a name="Sg5fY"></a>
# 泛型
- 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
- 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
**好处:**
1. 编译时,检查添加元素的类型,提高了安全性
1. 减少了类型转换的次数,提高效率
> √不使用泛型
> Dog -加入->Object-取出-> Dog//放入到ArrayList 会先转成Object,在取出时,还需要转换成Dog
> √使用泛型
> Dog->Dog-> Dog//放入时,和取出时,不需要类型转换,提高效率
3. 不再提示编译警告
```java
package test;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
//使用传统的方法来解决===> 使用泛型
//1. 当我们 ArrayList<Dog> 表示存放到 ArrayList 集合中的元素是Dog类型
//2. 如果编译器发现添加的类型,不满足要求,就会报错
//3. 在遍历的时候,可以直接取出 Dog 类型而不是 Object
//4. public class ArrayList<E> {} E称为泛型,那么 Dog->E
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.getName() + "-" + dog.getAge());
}
}
}
/*
1.请编写程序,在ArrayList 中,添加3个Dog对象
2.Dog对象含有name 和 age, 并输出name 和 age (要求使用getXxx())
*/
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;
}
}
class Cat { //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;
}
}