枚举类型与泛型
枚举类型可以取代以往常量的定义方式,即将常量封装在类或接口中
使用枚举类型设置常量
关键字为enum
枚举类型的常用方法
values()方法
枚举类型实例包含一个values()方法,该方法将枚举中所有的枚举值以数组的形式返回。
valueOf()可以将普通字符串转换为枚举类型
compareTo()方法用于比较两个枚举类型对象定义时的顺序。
枚举类型中的ordinal()方法用于获取某个枚举对象的位置索引值。
注意:
关于构造方法,在枚举类型中,无论是无参构造方法还是有参构造方法,修饰权限都为private。
泛型
泛型实质上就是使程序员定义安全的类型。
将基本类型向上转型或者是向下转型时,用错了类型,或者并没有执行该操作,就会出现异常,但由于语法不存在错误,因此可以被编译器接受,但在执行时会出现ClassCastException异常。
定义泛型
类名<T>
T是泛型的名称,代表某一种类型。如果不指定具体类型,T则采用Object类型。
在使用类中的方法传递或返回数据类型时将不再需要进行类型转换操作,而是使用在声明泛型类对象时“< >”符号中设置的数据类型。
在定义泛型类时,可以声明多个类型,在实例化指定类型的对象时就可以指定多个类型。
Class Myclass<T1,T2>{}
Myclass<Boolean,Float> m = new Myclass<Boolean,Float>()
定义泛型类时也可以声明数组类型,但注意不可以使用泛型来建立数组的实例。
使用泛型实例化常用集合类
泛型的高级用法
限制泛型可用类型
Class 类名称<T extends anyClass>
使用泛型限制后,泛型类的类型必须实现或继承anyClass这个接口或类,且必须使用extends关键字。例如下列的l1和l2是正确的,l3则不能。
当没有使用extends关键字限制泛型类型时,默认Object类下的所有子类都可以实例化泛型类对象。
使用类型通配符
作用是在创建一个泛型类对象时限制这个泛型类的类型实现或继承某个接口或类的子类。
泛型类名称<? extends List> a =null
还可以将该实例放置在方法的参数中。
Public void doSomething(A<? extends List> a){}
如果使用A<?>这种形式实例化泛型类对象,则默认表示可以将A指定为实例化Object及以下的子类类型。
“List<?> l2 = l1”语句与“List l2 = l1”语句存在何种本质区别?这里需要注意的是,对于使用通配符的对象不能向其中加入新的信息,只能从其中获取或删除信息。
泛型类型限制除了可以向下限制,还可以进行向上限制,只要在定义时使用super关键字即可。例如,像“A<? super List> a = null;”这样定义后,对象a只接受List接口或上层父类类型,如“a =new A<Object>();”。
定义为泛型的类和接口也可以被继承与实现。
如果在SubClass类继承ExtendClass类时保留父类的泛型类型,需要在继承时指明,如果没有指明,直接使用“extends ExtendsClass”进行继承操作,则SubClass类中的T1、T2和T3都会自动变为Object类型,所以在一般情况下都将父类的泛型类型进行保留。
泛型总结
泛型的类型参数只能是类类型,不可以是简单类型,如A<int>这种泛型定义就是错误的。
泛型的类型个数可以是多个。
可以使用extends关键字限制泛型的类型。
可以使用通配符限制泛型的类型