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 全类名.*/枚举对象
点击查看枚举实现单例(内部枚举)

进程:一个程序的运行过程

posted @ 2022-08-02 22:10  404notfond  阅读(19)  评论(0)    收藏  举报