泛型就是一个标签:<数据类型>
泛型可以在编译阶段约束只能操作某种数据类型。
注意:JDK1.7开始之后,泛型后面的声明可以省略不写!!
泛型和集合都只支持引用数据类型,不支持基本数据类型。
泛型的好处:泛型在编译阶段约束了操作的数据类型,从而不会出现类型转换异常。体现的是Java的严谨性和规范性,数据类型,经常需要进行统一。
泛型类的概念:使用了泛型定义的类就是泛型类
泛型类的格式:
修饰符 class 类名<泛型变量>{
}
泛型变量建议使用E、T、K、V
需求:模拟ArrayList自定义一个集合MyArrayList集合。
泛型类的核心思想:是把出现泛型变量的地方全部替换成传输的真实数据类型。
泛型方法:定义了泛型的方法就是泛型方法
泛型方法的定义格式:
修饰符 <泛型变量> 返回值类型 方法名称(形参列表){
}
注意:方法定义了是什么泛型变量,后面就只能用什么泛型变量
需求:给你任何一个类型的数组,都能返回它的内容
public class Main {
public static void main(String[] args) {
// write your code here
Integer[] nums = {10,20,30,40,50};
String s1 = arrToString(nums);
System.out.println(s1);
String[] strs = {"a","b","c","d"};
String s2 = arrToString(strs);
System.out.println(s2);
}
public static String arrToString(T[] params){
StringBuilder sb = new StringBuilder();
if (params!=null && params.length>0){
for (T temp:params
) {
sb.append(temp);
}
}
return sb.toString();
}
}
什么是泛型接口:使用了泛型定义的接口就是泛型接口
泛型接口的核心思想:在实现接口的时候传入真实的数据类型,这样重写的方法就是对该数据类型进行操作。
泛型接口的格式:
修饰符 interface 接口名称<泛型变量>{
}
需求:教务系统,提供一个接口可约束一定要完成数据的增删改查操作
// 泛型接口
public interface Data {
void add(E stu);
void delete(E stu);
void update(E stu);
void query(int id);
}
package com.company;
import java.util.Date;
public class StudentData implements Data {
@Override
public void add(Student stu) {
}
@Override
public void delete(Student stu) {
}
@Override
public void update(Student stu) {
}
@Override
public void query(int id) {
}
}
需求:开发一个极品飞车的游戏,所有的汽车都能一起参加比赛
package com.company;
import java.util.ArrayList;
public class GenericDemo {
public static void main(String[] args) {
ArrayList bmws = new ArrayList<>();
bmws.add(new BMW());
bmws.add(new BMW());
bmws.add(new BMW());
run(bmws); // 报错
ArrayList benzs = new ArrayList<>();
benzs.add(new BENZ());
benzs.add(new BENZ());
benzs.add(new BENZ());
run(benzs); // 报错
}
// 定义一个方法,可以让很多汽车一起进入参加比赛
public static void run(ArrayList cars){
}
}
class Car{
}
class BMW extends Car{
}
class BENZ extends Car{
}
注意:虽然BMW和BENE都集成了Car,但是ArrayList
通配符:?,可以用在使用泛型的时候代表一切类型。E、T、K、V是在定义泛型的时候使用,代表一切类型。
package com.company;
import java.util.ArrayList;
public class GenericDemo {
public static void main(String[] args) {
ArrayList bmws = new ArrayList<>();
bmws.add(new BMW());
bmws.add(new BMW());
bmws.add(new BMW());
run(bmws); // 不报错
ArrayList benzs = new ArrayList<>();
benzs.add(new BENZ());
benzs.add(new BENZ());
benzs.add(new BENZ());
run(benzs); // 不报错
ArrayList dogs = new ArrayList<>();
dogs.add(new Dog());
dogs.add(new Dog());
dogs.add(new Dog());
run(dogs); // 不报错
}
// 定义一个方法,可以让很多汽车一起进入参加比赛
public static void run(ArrayList> cars){
}
}
class Car{
}
class BMW extends Car{
}
class BENZ extends Car{
}
class Dog{
}
泛型上下限:
? extends Car:那么?必须是Car或者其子类。(泛型的上限)
? super Car:那么?必须是Car或者其父类。(泛型的下线,不是很常见)
package com.company;
import java.util.ArrayList;
public class GenericDemo {
public static void main(String[] args) {
ArrayList bmws = new ArrayList<>();
bmws.add(new BMW());
bmws.add(new BMW());
bmws.add(new BMW());
run(bmws); // 不报错
ArrayList benzs = new ArrayList<>();
benzs.add(new BENZ());
benzs.add(new BENZ());
benzs.add(new BENZ());
run(benzs); // 不报错
ArrayList dogs = new ArrayList<>();
dogs.add(new Dog());
dogs.add(new Dog());
dogs.add(new Dog());
run(dogs); // 报错
}
// 定义一个方法,可以让很多汽车一起进入参加比赛
public static void run(ArrayList extends Car> cars){
}
}
class Car{
}
class BMW extends Car{
}
class BENZ extends Car{
}
class Dog{
}