泛型的用处
- 将运行时的异常提前至了编译时
- 避免了无谓的强制类型转换
自定义泛型
自定义泛型就是一个数据类型的占位符或者是一个数据类型的变量。
自定义泛型的命名符合标识符的规则即可,但时,一般用大写字母T(Type) 或 E (Element)表示。
1.方法上自定义泛型
修饰符 <声明的自定义泛型> 返回值类型 函数名(使用的自定义泛型...) {
}
public <T> T test(T t) {
return t;
}
2.泛型类
class 类名<声明自定义泛型>{
}
class Test<T> {
public void add(T t) {
}
public T remove(T t) {
return t;
}
}
注意
1.泛型类定义的泛型的具体数据类型,是在使用该类创建对象时确定的。
2.当使用泛型类创建对象时,没有指定具体的泛型数据类型,则默认为Object。
3.泛型类上的自定义泛型,不能作用于静态方法。
4.静态方法如果要使用自定义泛型,需要自己声明使用。
3.泛型接口
interface 接口名<声明自定义泛型> {
返回值类型 函数名(使用的自定义泛型...);
}
interface Test<T> {
T add(T t);
}
//如果要延长接口自定义泛型的具体数据类型,那么格式如下
class ImpTest<T> implements Test<T> {
@Override
public T add(T t) {
return null;
}
}
注意
1.泛型接口定义的泛型的具体数据类型,是在实现接口的时候确定的。
2.当使用泛型接口时,没有指定具体的泛型数据类型时,则默认为Object类型。
泛型的上下限
限制上下限需要通配符:?
上限:? super 目标类
下限:? extends 目标类
1.泛型的上限
定义一个函数可以接收任意数据类型的集合对象,要求接收的集合对象只能存储Integer或者其父类类型的数据。
public static<T> Collection<? super Integer> test(Collection<? super Integer> t) {
return t;
}
2.泛型的下限
定义一个函数可以接收任意数据类型的集合对象,要求接收的集合对象只能存储Number或者其子类类型数据。
public void test(Collection<? extends Number> collection) {
}
泛型的擦除转换
泛型编译之后就消失(擦除)。
当把带有泛型的集合赋给不带泛型的集合,此时泛型就被擦除(手动擦除)。
ArrayList<Integer> arrayList = new ArrayList<>();
ArrayList arrayList2 = new ArrayList<>();
//泛型擦除
arrayList2 = arrayList;
arrayList2.add("Test");
System.out.println(arrayList2);
枚举
enum Demo {
MAN, WOMAN;
}
枚举应用场景
如果存在多个数据选项,但每次只能选择一个时,可以用枚举。
枚举注意细节
1.枚举是一个特殊的类,枚举值必须位于枚举类的第一行。
2.枚举类的构造方法默认的修饰符是private,自定义的构造函数也要是private。
3.枚举值默认的修饰符是public static final,可以定义自己的成员变量与成员函数
4.枚举值的数据类型是该枚举值所属类的类型,然后枚举值是指向了本类的对象的。
5.枚举类可以存在抽象方法,但是枚举值必须要实现抽象的方法。
public static void main(String[] args) {
Demo demo = Demo.MAN;
demo.value = "测试数据";
demo.run();
}
enum Demo {
MAN("男") {
@Override
public void run() {
System.out.println("男人疾跑:" + value);
}
}, WOMAN("女") {
@Override
public void run() {
System.out.println("女生慢跑:" + value);
}
};
String value;
Demo(String value) {
this.value = value;
}
public abstract void run();
}
enum EnumDemo {
MAN, WOMAN
}
public class Main {
public static void main(String[] args) {
demo(EnumDemo.MAN);
}
public static void demo(EnumDemo demo) {
switch (demo) {
case MAN:
System.out.println("男");
break;
case WOMAN:
System.out.println("女");
break;
}
}
}