泛型引出
- 根据需求分析问题
- 请编写程序,在ArrayList中,添加3个Dog对象
- Dog对象含有name 和 age ,并输出name 和 age (要求使用getXxx())
- 思考
- 如果再添加一个Cat类,并为ArrayList集合添加Cat对象,会发生什么问题?
package com.tao.generic_;
import java.util.ArrayList;
/**
* Create By 刘鸿涛
* 2022/1/10 19:24
*/
public class Generic01 {
public static void main(String[] args) {
ArrayList arraylist = new ArrayList();
arraylist.add(new Dog("大黄",2));
arraylist.add(new Dog("大黑",4));
arraylist.add(new Dog("大胖",3));
//此时,在我想要添加一个Dog时,不小心添加了一个Cat,但是编译器却没有报错,所以要用到泛型来解决此问题
arraylist.add(new Cat("叮当猫",40));
for (Object o:arraylist){
//向下转型Object -> Dog
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;
}
}
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;
}
}
泛型入门(generic)
package com.tao.generic_;
import java.util.ArrayList;
/**
* Create By 刘鸿涛
* 2022/1/10 19:24
*/
public class Generic02 {
public static void main(String[] args) {
ArrayList<Dog> arraylist = new ArrayList<Dog>();
arraylist.add(new Dog("大黄",2));
arraylist.add(new Dog("大黑",4));
arraylist.add(new Dog("大胖",3));
// arraylist.add(new Cat("叮当猫",40)); //注意,泛型中添加Cat类会报错
for (Dog dog:arraylist){
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;
}
}
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;
}
}
泛型的好处
- 编译时,检查添加元素的类型,提高了安全性
- 减少了类型转换的次数,提高效率
- 不使用泛型
Dog -> Object -> 取出 -> Dog //放入到ArrayList 会先转换成 Object,在取出时,还需要转换成Dog
- 使用泛型
Dog -> Dog -> Dog //放入时,和取出时,不需要类型转换,提高效率
- 不再提示编译警告
泛型介绍</E/> 就是一个形参
泛(广泛),型(类型)> => Integer,String,Dog
- 泛型又称为参数化类型,是jdk5.0 出现的新特性,解决数据类型的安全性问题
- 在类声明或实例化时只要指定好需要的具体的类型即可
- Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁,健壮
- 泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型。
package com.tao.generic_;
/**
* Create By 刘鸿涛
* 2022/1/10 19:55
*/
public class Generic03 {
public static void main(String[] args) {
Person<String> taotao = new Person<String>("涛涛");
System.out.println(taotao);
taotao.t(); //输出类型
Person<Integer> integerPerson = new Person<>(10);
System.out.println(integerPerson);
integerPerson.t(); //输出类型
}
}
class Person<E>{
E s; //E表示 s的数据类型,该数据类型在你创建对象时指定
public Person(E s){ //E也可以是参数类型
this.s = s;
}
public E f(){ //返回类型使用E
return s;
}
public void t(){
System.out.println(s.getClass());
}
}