2022-08-01 day19 第一小组 王鸣赫
泛型
类型擦除:(编译角度)泛型在编译后全按object类型处理(就是让程序员编写代码是遵守的“规则”:创建对象时建立了规则,以后使用我这个对象时必须遵守我的规则(编码角度))
泛型;标记类型(T-类型 K-key V-value E-element元素 ?-通配符) “暂时不确定是什么类型,用的时候再确认”(类型参数化-你把想要的类型作为参数传给我确定类型)
泛型类/接口:类名 在整个“类”中都可以使用,可以在使用这个类的时候指定类型然后类中所有的使用T类型的方法
泛型方法:返回值和参数列表,写返回值之前定义泛型<>("声明泛型"),必须配合传参(传的参数是啥类型,泛型就是啥类型)----前提 必须要有泛型声明和返回值;必须要有参数。(泛型方法多数放在非泛型类中)
泛型与继承:
1.父类是泛型类,子类不一定是
2.泛型的声明在类名之后或者在方法名中间
3.父类跟随子类确定泛型的类型
4.在继承后,子类不是泛型类,继承的东西(方法,属性)就是object类型
5.静态泛型方法必须直接声明泛型
适用场景(当类型无法确定时使用)
1.父类(接口中):定义规则,没有明确要求(由子类确定)
2.容器类:存储的数据类型由使用者确定
点击查看代码
修饰符 class 类名<代表泛型的变量> { }
怕你不清楚怎么使用,这里我还是做了一个简单的泛型类:
/**
* @param <T> 这里解释下<T>中的T:
* 此处的T可以随便写为任意标识,常见的有T、E等形式的参数表示泛型
* 泛型在定义的时候不具体,使用的时候才变得具体。
* 在使用的时候确定泛型的具体数据类型。即在创建对象的时候确定泛型。
*/
public class GenericsClassDemo<T> {
//t这个成员变量的类型为T,T的类型由外部指定
private T t;
//泛型构造方法形参t的类型也为T,T的类型由外部指定
public GenericsClassDemo(T t) {
this.t = t;
}
//泛型方法getT的返回值类型为T,T的类型由外部指定
public T getT() {
return t;
}
}
点击查看泛型实现类
点击查看代码
public class GenericsClassDemo<String> {
private String t;
public GenericsClassDemo(String t) {
this.t = t;
}
public String getT() {
return t;
}
}
泛型接口
点击查看代码
1、定义类时确定泛型的类型
public class GenericsImp implements GenericsInteface<String> {
@Override
public void add(String s) {
System.out.println("设置了泛型为String类型");
}
}
2、始终不确定泛型的类型,直到创建对象时,确定泛型的类型
public class GenericsImp<T> implements GenericsInteface<T> {
@Override
public void add(T t) {
System.out.println("没有设置类型");
}
}
确定泛型:
public class GenericsTest {
public static void main(String[] args) {
GenericsImp<Integer> gi = new GenericsImp<>();
gi.add(66);
}
}
通配符高级使用
泛型的上限:
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类
泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型
枚举类:(类名要以Enum结尾)
1.把需要用到的对象声明出来 -对象名(构造参数) 2.可以有set和get方法 3.可以有构造器(私有) 枚举的静态导入(不用类名.了) import static 全类名.*/枚举对象
点击查看枚举实现单例(内部枚举)

浙公网安备 33010602011771号