20220801 第六组 张嘉源 学习笔记
泛型
参数化类型
类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型的使用
<>声明
泛型类
把泛型定义在类上(最典型的就是容器类,如List),在使用时确定类型
//此处T还可以写为E、K、V等形式的参数常用语表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{
//key这个成员变量类型为T,T的类型由外部指定
private T key;
public Generic(T key){
//泛型构造方法形参key的类型也为T,T的类型由外部指定
this.key=key;
}
public T getKey(){
//泛型方法getKey的返回值类型为T,T的类型由外部指定
return key;
}
}
//传入的实参类型需与泛型的类型参数类型相同,即为Integer
Generic<Integer> genericInteger = new Generic<Integer>(123456);
//传入的实参类型需与泛型的类型参数类型相同,即为String.
Generic<String> genericString = new Generic<String>("key_vlaue");
Log.d("泛型测试","key is " + genericInteger.getKey());
Log.d("泛型测试","key is " + genericString.getKey());
如果一个泛型类没有指定泛型类型,默认Object
在jdk7以后,可以省略等号右边泛型的声明,<>必须写,规范
泛型类在继承的时候,父类是泛型类,子类可以是,可以不是;在继承时,如果没有写出任何类型,子类就不是泛型类;在子类继承父类时,子类泛型和父类泛型都写出来的时候,父跟子
泛型的声明只能在当前类名后或者方法中间而且声明的泛型是自己的
泛型方法
public 与 返回值中间
如果只关心某个方法,可以不定义泛型类,只定义泛型方法,定义泛型方法时,泛型方法不一定在泛型类里
在定义泛型方法时,要首先定义泛型类型,定义在方法中间,使用泛型方法最好结合返回值,和Object一样
如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 (static
如果在一个泛型类中,就没必要写泛型方法,泛型方法一般出现在非泛型类中
泛型接口
在接口上定义的泛型,当一个类型未确定的类实现接口时,需要声明该类型
public interface CalcGeneric<T> {
T add(T num1, T num2);
}
public class CalculatorGeneric<T> implements CalcGeneric<T> {
@Override
public T add(T num1, T num2) {
return null;
}
}
泛型擦除
泛型只在编译阶段有效
为了兼容性,使用原始类型(没有泛型)是可以的,泛型刚刚出现的时候,还存在大量的不使用泛型的代码,为了保证代码的兼容性,将参数化类型的实例传递给设计用于原始类型的方法必须擦除
为了保持兼容性,Java泛型中,其实有一种类似伪泛型
所有的泛型都会被擦掉
枚举
一个类有多个实例
定义枚举要使用enum关键字
public enum Ch01{
SPRING,SUMMER,AUTUMN,WINTER;
Ch01 d=Ch01.APRING;
}
优势
1.int不具备安全性,枚举类,天然的常量类
2.使用int类型,语义不够明确,枚举里面都是常量,静态,推荐使用==比较