Java中一个重要的类型:枚举,它可以用来表示一组取值范围固定的变量,使用 enum 关键字定义枚举类型,其中元素不能重复,通常大写表示。利用Java的反射机制,可以在运行时分析类,如查看枚举类型的修饰符、父类和自定义方法等,下面简单说下。

(一)枚举类型

定义一个简单的枚举类型,如下:

public enum Position{
EAST,SOUTH,WEST,NORTH
}

利用Java反射机制分析类:

//获取Class对象
Class eClass = Position.class;
String modify = Modifier.toString(eClass.getModifiers());
System.out.println("修饰符:"+modify);
System.out.println("父类:"+eClass.getSuperclass());

输出为:

修饰符:public static final

父类:class java.lang.Enum

Enum类是所有枚举类型的父类,它是一个没有抽象方法的抽象类。该类定义了枚举类型的常用方法,如枚举元素间的比较compareTo()和equals()方法、枚举元素定义的名称name()方法等,可以使用“==”比较两个枚举元素。

枚举类型不能继承,可以看做普通类,像定义方法,这里就不做介绍了,基本很少用到。

(二)泛型

泛型是Java中的重要特性,使用泛型编程可以使代码获得最大的重用。在使用泛型时要指明泛型的具体类型,避免类型转换。

定义一个栈结构的泛型类:

/*
* 泛型:定义参数类型为T的泛型类
*/
public class Stack {
//使用T类型的链表保存入栈的元素(简化开发)
private LinkedList conter = new LinkedList();
//向栈中添加元素
public void push(T t){
conter.addFirst(t);
}
//从栈中删除元素
public T pop(){
return conter.removeFirst();
}
//判断链表是否为空
public boolean empty(){
return conter.isEmpty();
}
}

测试类:

public static void main(String[] args) {
//创建栈对象,并指定参数类型
Stack stack = new Stack();
//添加元素
stack.push("Java");
stack.push("Php");
stack.push("Python");
//遍历栈
while(!stack.empty()){
System.out.println((String)stack.pop());
}
}

泛型类就是含有一个或多个类型参数的类,泛型参数的命名一般使用单个的大写字母,如上所示,且有一定的局限性,像泛型类型的参数只能使用类类型,如String、Integer等,而不能使用基本数据类型,如int、float等,不能抛出或捕获泛型类型的实例,不能直接使用泛型数组,不能实例化类型变量等。

Java中的泛型不支持实例化类型变量,如 “T[] arr = new T[10];”,属于非法的语句。对于某些不足之处,可以使用Java反射机制进行弥补,如泛型数组,这里不做介绍了,大家感兴趣的可以自行百度查看。

在Java中,不仅可以声明泛型类,还可以在普通类中声明泛型方法。声明泛型方法需要注意:

使用格式来表示泛型类型参数,参数的个数可以多个;

类型参数列表要放在访问权限修饰符、static和final之后;

类型参数列表要放在返回值类型、方法名称、方法参数之前;

简单的声明如下所示:

public static List query(String sql){}

利用泛型类型参数可以将类、方法或接口的类型限制为T类型,但不够灵活。Java中可以使用通配符增强泛型,使用“?”作为通配符,可以利用extends关键字来设置取值的上限,如:“ extends Number>”表示Byte、Double、Float、Integer等都适合这个类型参数。另外还可以设置取值下限,这里不做介绍了。

泛型在Java中的一个应用:查找。在数据结构中,查找有很多类型,如顺序查找、折半查找、散列查找等,这里有泛型化的折半查找法,大家感兴趣的可自行学习。

好了,上面就是一些关于Java中枚举类型和泛型的知识总结,希望大家喜欢。