枚举类:提供了安全检查功能,本质上以类的形式存在。
泛型:能够解决类型安全问题,提供编译时的安全检查。
枚举类型
枚举类定义常量的语法:
public enum Constants{
Constants_A;
Constants_B;
Constants_C;
}
当定义一个枚举类型时,每一个枚举类型成员都可以看作是枚举类型的一个实例;这些枚举类型成员都默认被public、static、final修饰,所以当使用枚举类型成员时直接使用枚举类型名称调用枚举成员即可。
在枚举类型中,可以添加构造方法,但是规定这个构造方法必须为private修饰符所修饰。
泛型
泛型的类型参数只能是类类型,不可以是简单类型。
泛型的类型个数可以是多个
限制泛型可用类型:class 类名称<T extends anyClass>
表示泛型类的类型必须是实现或继承了anyClass这个接口或类。
类型通配符:泛型类名称<? extends anyClass> a = null;
<? extends anyClass>:表示类型未知,当需要使用该泛型对象时,可以单独实例化
创建一个泛型类对象时限制这个泛型类的类型实现或继承某个接口或类的子类
例如:
A<? extends List> a = null;
a = new A<ArrayList>();
a = new A<LinkedList>();
如果实例化一个没有实现List接口的泛型对象,编译器将会报错。
还可以将它放到方法参数中:
public void doSomething(A<? ArrayList>a){ //限定了参数类型
}
使用通配符声明的名称实例化的对象不能对其加入新的信息,只能获取或删除。
泛型向上限制:class 类名称<T super anyClass> //(anyClass指某个接口或者类;表示泛型类型必须为anyClass或他的父类类型)
使用泛型类声明数组:
可以使用泛型机制时声明一个数组,但是不可以使用泛型来建立数组的实例。如下:
private T[] array; //正确的
private T[] array = new T[]; //错误的
继承泛型类与实现泛型接口:
public class ExtendClass<T1>{
}
class SubClass<T1,T2,T3> extends ExtendClass<T1>{
}
如果在SubClass类继承ExtendClass类时保留父类的泛型类型,需要在继承时指明;如果没有指明,直接使用extends ExtendClass语句进行继承操作,则SubClass类中的T1、T2、T3都会自动变成Object,
泛型基础实例:
public class GenericTest<T> {
private T over;
public T getOver() {
return over;
}
public void setOver(T over) {
this.over = over;
}
public static void main(String[] args) {
GenericTest<Boolean> gTest = new GenericTest<>();
GenericTest<Float> gTest1 = new GenericTest<>();
gTest.setOver(true);
gTest1.setOver(123f);
Boolean b1= gTest.getOver();
Float f1 = gTest1.getOver();
System.out.println(b1+" "+f1);
}
}