本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员Java+AI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。
01 认识泛型
概念:定义类、接口、方法时,同时声明了一个或者多个类型变量(如:<E>
) 称为泛型类、泛型接口,泛型方法、它们统称为泛型。
作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!
package generic;
import java.util.ArrayList;
public class GenericDemo1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>(); //泛型
list.add("msc");
list.add("zlg");
list.add("phd");
list.add("zqy");
for(int i=0; i<list.size(); i++){
String s = list.get(i);
System.out.println(s);
}
}
}
02 泛型类
MyArrayList.java
//自定义泛型类
public class MyArrayList<E>{
//换汤不换药
private ArrayList list = new ArrayList();
public boolean add(E e){
return list.add(e);
}
public boolean remove(){
return list.remove(e);
}
@Override
public String toString(){
return list.toString();
}
}
03 泛型接口
Student.java
自定义类
public class Student {
}
Teacher.java
自定义类
public class Teacher {
}
Data.java
自定义接口
public interface Data<T> {
void add(T t);
void delete(T t);
void update(T t);
T find(int id);
}
StudentData.java
自定义接口实现类(传递Student
类)
public class StudentData implements Data<Student>{
@Override
public void add(Student student) {
}
@Override
public void delete(Student student) {
}
@Override
public void update(Student student) {
}
@Override
public Student find(int id) {
return null;
}
}
TeacherData.java
自定义接口实现类(传递Teacher
类)
public class TeacherData implements Data<Teacher>{
@Override
public void add(Teacher teacher) {
}
@Override
public void delete(Teacher teacher) {
}
@Override
public void update(Teacher teacher) {
}
@Override
public Teacher find(int id) {
return null;
}
}
GenericDemo3.java
public class GenericDemo3 {
public static void main(String[] args) {
//目标:自定义泛型接口
StudentData stu = new StudentData();
stu.add(new Student());
stu.delete(new Student());
Student stu2 = stu.find(1);
}
}
04 泛型方法
public class GenericDemo4 {
public static void main(String[] args) {
String[] names = {"张三","李四","王五","赵六"};
printArray(names);
String max = getMax(names);
Student[] stus = new Student[100];
printArray(stus);
Student max2 = getMax(stus);
}
public static <T> void printArray(T[] names){
}
public static <T> T getMax(T[] names){
return null;
}
}
05 通配符和上下限
通配符就是?
,可以在使用泛型的时候代表一切类型,ETKV
是在定义泛型的时候使用。
Car.java
public class Car {
}
Xiaomi.java
public class Xiaomi extends Car{
}
Weilai.java
public class Weilai extends Car{
}
GenericDemo5.java
import java.util.ArrayList;
public class GenericDemo5 {
public static void main(String[] args) {
ArrayList<Xiaomi> xiaomis = new ArrayList<>();
xiaomis.add(new Xiaomi());
xiaomis.add(new Xiaomi());
xiaomis.add(new Xiaomi());
ArrayList<Weilai> weilais = new ArrayList<>();
weilais.add(new Weilai());
weilais.add(new Weilai());
weilais.add(new Weilai());
}
public static void go(ArrayList<? extends Car> cars){
}
}
06 泛型支持的类型
泛型不支持基本数据类型,故产生了包装类,包装类就是把基本数据类型包装成对象类型。
- 自动装箱:基本数据类型可以自动转换为包装类型。
- 自动拆箱:包装类型可以自动转换为基本数据类型。
为了万物皆对象,并且泛型和集合都不支持基本类型,我们支持包装类!
package generic;
import java.util.ArrayList;
public class GenericDemo6 {
public static void main(String[] args) {
Integer it1 = Integer.valueOf(100); //不是数字100,而是对象100
Integer it2 = Integer.valueOf(100); //it1 == it2
//自动装箱
Integer it3 = 150;
Integer it4 = 145;
ArrayList<Integer> list = new ArrayList<>();
list.add(138);
//自动拆箱
int i1 = it3;
int i2 = list.get(138);
System.out.println("-----------------------------------------");
//重要作用:包装类可以将字符串数值转化为对应的基本数据类型
String s1 = "98";
int i = Integer.valueOf(s1);
System.out.println(i + 2); //100
String s2 = "3.14";
double d = Double.valueOf(s2);
System.out.println(d + 2); //5.14
}
}