枚举类型是将常量封装在类或接口中,本质上还是以类的形式存在。泛型可以减少代码量,还不会因为对象置于某个容器中而失去其类型。
1.枚举类型
①使用枚举类型设置常量
常量一般放在接口,便于使用,且在接口中使用final或static关键字修饰。
而泛型的出现逐渐取代了该方式,泛型定义常量语法:
接口定义与泛型定义区别:
定义一个枚举类型时,可以把每一个枚举类型成员都看作是枚举类型的一个实例,枚举类型的常用方法:
(i)values方法
将枚举类型成员(所有枚举值)以数组形式返回,如下:
(ii)valueOf方法与compareTo方法
valueOf()方法可以将普通字符串转换为枚举类型,而compareTo()方法可以用于比较两个枚举类型对象定义时的顺序。如下:
(iii)ordinal()方法
用于获取某个枚举对象的位置索引值。
(iv)枚举类型的构造方法
枚举类型的无参或者有参构造方法必须被private修饰,定义一个有参构造方法后需要对枚举类型成员使用该构造方法。如Constant("我是枚举常量"),Constant(2)可以相应的使用参数为String型和int型构造方法。然后可以在枚举类型中定义成员变量,在构造方法中为变量赋值,这样就可以在枚举类型中定义该成员变量的getXXX()方法。如下:
使用枚举类型的优点:类型安全,运行效率高,紧凑有效,完美交互。
训练:星期枚举
2.泛型
在某些强制类型转换的错误不会被编译器捕捉,(向上转型是安全的,向下转型操作时用错了类型,或者并没有执行该操作,就会出现异常)所以提供了泛型机制。
①定义泛型
类名<T>
其中T是泛型的名称,代表某一种类型,在创建该类对象时需要指定T所代表的具体类型,如果不指定具体类型,则采用Object型。
实例:
②泛型的常规用法:
(i)定义泛型类时声明多个类型
class Myclass<T1,T2>
(ii)定义泛型类时声明数组类型
但是不能使用泛型建立一个数组实例
(iii)集合类声明容器元素
集合接口,集合类都被定义了泛型,比如List<E>的泛型E,Map<K,V>的泛型K,V。
常见的被泛型化的集合有:
实例:
③泛型的高级用法:
(i)限制泛型可用类型
可对泛型类实例进行限制,语法如下:
class 类名称<T extends anyClass>
anyClass是指某个接口或类。
使用泛型限制后,泛型类的类型必须继承或实现这个接口或者类。
(ii)使用类型通配符
主要作用:创建一个泛型类对象时限制这个泛型类的类型实现或者继承某个接口或类。声明一个这样的对象可以用"?"通配符表示,同时用extends对泛型类型限制。语法如下:
泛型类名称<? extends List> a=null;
其中<? extends List>表示类型未知,当需要使用该泛型对象时,可以单独实例化
(iii)继承泛型类或实现泛型接口