一、泛型的定义
二、泛型类
三、泛型接口
以下代码只是为了体现泛型接口的大致运用,不做具体操作
- Data接口:
package com.genericity_interface;
import java.util.ArrayList;
//泛型接口
public interface Data<T> {
//里面的类型对象也可以继承,后面运用的时候就只能是被继承的或者他的子类
//public interface Data<T extends Animal>{}
//对象
void add(T t);
//返回值类型是泛型集合
ArrayList<T> getByName(String name);
}
- Student类:
package com.genericity_interface;
public class Student {
}
- Teacher类:
package com.genericity_interface;
public class Teacher {
}
- StudentData类:
package com.genericity_interface;
import java.util.ArrayList;
public class StudentData implements Data<Student>{
//按alt+回车键直接重写全部
@Override
public void add(Student student) {
}
@Override
public ArrayList<Student> getByName(String name) {
return null;
}
}
- TeacherData类:
package com.genericity_interface;
import java.util.ArrayList;
//实现类
public class TeacherData implements Data<Teacher>{
//实现类实现接口,必须重写完全部接口的全部抽象方法,否则实现类需定义为抽象类
@Override
public void add(Teacher teacher) {
}
@Override
public ArrayList<Teacher> getByName(String name) {
return null;
}
}
- Test主类:
package com.genericity_interface;
public class Test {
public static void main(String[] args) {
//目的:掌握泛型接口的定义和使用
//场景:系统需要处理学生和老师的数据,需要提供2个功能,保存对象数据,根据名称查询数据
}
}
四、泛型方法
- 车类:
package com.genericity_method;
public class Car {
}
- 宝马类:
package com.genericity_method;
public class BaoM extends Car{
}
- 奔驰类:
package com.genericity_method;
public class Benc extends Car{
}
- 狗类(做对比用):
package com.genericity_method;
public class Dog {
}
- Test类:
package com.genericity_method;
import java.sql.Array;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
test("hello");
System.out.println(test("java"));
System.out.println(test(2));
//传进一个狗对象
Dog d = test(new Dog());
System.out.println(d);
//让所有的汽车参加比赛
//向车集合中加入一辆宝马和一辆奔驰
ArrayList<Car> cars = new ArrayList<>();
cars.add(new BaoM());
cars.add(new Benc());
go(cars);
//向宝马集合中加入两辆宝马
ArrayList<BaoM> baoms = new ArrayList<>();
baoms.add(new BaoM());
baoms.add(new BaoM());
go(baoms);
//向奔驰集合中加入两辆奔驰
ArrayList<Benc> bencs = new ArrayList<>();
bencs.add(new Benc());
bencs.add(new Benc());
go(bencs);
//测试:狗参与比赛
// ArrayList<Dog> dogs = new ArrayList<>();
// dogs.add(new Dog());
// dogs.add(new Dog());
// go(dogs);
}
//第一种:ArrayList<Car>和ArrayList<BaoM>以及ArrayList<Benc>是没关系的,相当于公共厕所和男厕、女厕一样,公厕男女都能进而男女厕不同
//这种都导致go(baoms);和go(bencs);报错
// public static void go(ArrayList<Car> cars){
//
// }
//第二种:什么方法都接
// public static <T> void go(ArrayList<T> cars){
//
// }
//第三种:在第二种的基础上做出改变
//表示形参必须的基于Car父类的或者是Car
//其实ArrayList<T>本身就是一个泛型类,而<T extends Car>处有单独定义一个泛型类也是没有必要的(可以去掉),因此出现了第四种
// public static <T extends Car> void go(ArrayList<T> cars){
//
// }
//第四种
//ArrayList<>是泛型;
// ‘?‘:通配符,在使用泛型的时候可以代表一切类型
//”? extends Car"(上限),代表是Car或者他的子类;"? super Car"(下限);
public static void go(ArrayList<? extends Car> cars){
}
//泛型方法
//泛型变量是T,形参是泛型对象,返回值类型也是T(刚好t是泛型类型T的对象)
public static <T> T test(T t){
return t;
}
}