泛型
1.引出泛型
需求:
在ArrayList中添加3个Dog对象 dog对象含有name和age 使用get方法输出name和age
2.编写一个狗类
package com.hui;
public class Dog {
private String name;
public int 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;
}
public Dog() {
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
3.编写一个猫类
package com.hui;
public class Cat {
private String name;
public int 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;
}
public Cat() {
}
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
}
4.使用传统方法
public class Generic01 {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
//添加三个狗类
arrayList.add(new Dog("dahuang", 22));
arrayList.add(new Dog("huazi", 21));
arrayList.add(new Dog("wolong", 33));
//不小心添加一个猫类
arrayList.add(new Cat("maomi",76));
//遍历
for (Object o : arrayList) {
//向下转型
Dog dog = (Dog) o;
System.out.println(dog.getName());
System.out.println(dog.getAge());
}
}
}
5.程序运行结果
6.得出传统方法的问题
- 1.不能对加入集合中的数据进行约束(不安全)
- 2.遍历的时候需要进行类型转换,影响效率
7.使用泛型解决前面的问题
@SuppressWarnings("all")
public class Generic02 {
public static void main(String[] args) {
//使用泛型 表示存放到集合中的元素为Dog类型
ArrayList<Dog> arrayList = new ArrayList<Dog>();
arrayList.add(new Dog("dahuang", 22));
arrayList.add(new Dog("huazi", 21));
arrayList.add(new Dog("wolong", 33));
//对数据类型进行约束,编译器报错
//arrayList.add(new Cat("maomi",76));
//遍历的时候直接取出Dog类型不是Object类型 不用进行类型转换
for (Dog dog : arrayList) {
System.out.println(dog.getName()+"--"+dog.getAge());
}
}
}
8.泛型的好处
- 编译时检查元素的类型,提高了安全性
- 减少了类型转换次数,提高了程序的效率
9.泛型的介绍
泛型就是可以表示数据类型的一种数据类型
在类声明或实例化时候只要指定具体的类型即可
ArrayList<Dog> arrayList = new ArrayList<Dog>();
指定类型不会出现类型转换异常的发生
10.泛型的作用
可以在类声明的时候通过一个标识表示类中某个属性的类型
//该数据类型在定义Person对象的时候指定,在编译期间,就确定E是什么
class Person<E>{
// E表示s的数据类型
E s;
// E也可以是参数类型
public Person(E s) {
this.s = s;
}
// E也可以是返回类型
public E f(){
return s;
}
}
11.泛型的语法
在类名后边指定类型参数的值(类型)
ArrayList<String> strings = new ArrayList<String>();
给泛型指定数据类型时,要求是引用数据类型,不能是基本数据类型。
ArrayList<int> int = new ArrayList<int>(); //报错
在给泛型指定具体类型后,可以传入该类型或其子类型
不写泛型默认是Object类型
泛型使用形式:
ArrayList<String> strings = new ArrayList<这里可以省略不写>();
12.自定义泛型
基本语法:
class 类名<T,R…>{
// …表示可以有多个泛型
成员
}
静态方法不能使用泛型:
静态是和类相关的,在类加载时,对象还没创建出来,所以如果静态方法和静态属性使用了泛型,JVM就不知道是什么类型,无法完成初始化。
泛型方法:
可以使用类声明的泛型,也可以使用自己声明的泛型
13.泛型的继承和通配符
泛型不具备继承性
支持任意泛型类型
<? extends AA> AA表示上限 可以接受AA或AA的子类
<? super AA> 支持AA类以及AA类的父类
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288546.html