什么是枚举类
枚举类型(enum type)是指由一组固定的常量组成合法的类型。Java 中由关键字enum 来定义一个枚举类型
Java 定义枚举类型的语句有以下特点:
1) 使用关键字 enum ;
2) 类型名称,比如这里的 Season ;
3) 一串允许的值,
4) 枚举可以单独定义在一个文件中,也可以嵌在其它 Java 类中;
5) 枚举可以实现一个或多个接口(Interface);
6) 可以定义新的变量 ;
7) 可以定义新的方法;
8) 可以定义根据具体枚举值而相异的类
enum 就和 class 一样,只是一个关键字,他并不是一个类;
当我们使用 enmu 来定义一个枚举类型的时候,编译器会自动帮我们创建一个 final类型的类继承 Enum 类,所以枚举类型不能被继承
Java 枚举如何比较
java 枚举值比较用双等于号和 equals 方法没啥区别,两个随便用都是一样的效果。
因为 enum 类型的每个常量在JVM中只有一个唯一实例; 枚举 Enum 类的 equals 方法默认实现就是通过 == 来比较的;
枚举类可以应用在 switch 语句中。因为枚举类天生具有类型信息和有限个枚举常量,所以比 int 、 String 类型更适合用在 switch 语句中.
什么是泛型:
Java 泛型( generics) 是 JDK 5 中引⼊的⼀个新特性, 允许在定义类和接口的时候使⽤类型参数( type parameter) 。
声明的类型参数在使⽤时⽤具体的类型来替换
泛型最⼤的好处是可以提⾼代码的复⽤性。 以 List 接⼜为例,我们可以将 String、Integer 等类型放⼊List 中, 如不⽤泛型, 存放 String 类型要写⼀个 List 接口, 存放Integer 要写另外⼀个 List 接口, 泛型可以很好的解决这个问题;
泛型就是定义一种模板,例如 ArrayList ,然后在代码中为用到的类创建对应的 ArrayList<类型>;,既实现了编写一次,万能匹配,又通过编译器保证了类型安全;
类型擦除:
类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。
类型擦除的主要过程如下:
- 将所有的泛型参数用其最左边界(最顶级的父类型)类型替换
- 移除所有的类型参数。
- 1、虚拟机中没有泛型,只有普通类和普通方法,所有泛型类的类型参数在编译时都会被擦除,泛型类并没有自己独有的 Class 类对象。比如并不存在 List.class 或是List.class,而只有 List.class。
- 2、创建泛型对象时请指明类型,让编译器尽早的做参数检查;
- 3、不要忽略编译器的警告信息,那意味着潜在的ClassCastException 等着你。
- 4、 泛型的类型参数不能用在 Java 异常处理的 catch 语句中。因为异常处理是由JVM 在运行时刻来进行的。由于类型信息被擦除,JVM 是无法区分两个异常类型MyException和MyException的。对于 JVM 来说,它们都是MyException 类型的。也就无法执行与异常对应的 catch 语句。
通配符
通配符分为限定通配符和非限定通配符
- 限定通配符对类型进⾏限制, 泛型中有两种限定通配符:
表示类型的上界,格式为:<? extends T>,即类型必须为 T 类型或者 T 子类
<? extends T> 允许调用读方法 T get() 获取 T 的引用,但不允许调用写方法 set(T) 传入 T 的引用(传入 null 除外)
表示类型的下界,格式为:<? super T>,即类型必须为 T 类型或者 T 的父类
<? super T> 允许调用写方法 set(T) 传入 T 的引用,但不允许调用读方法 Tget() 获取 T 的引用(获取 Object 除外)。
- 泛型类型必须⽤限定内的类型来进⾏初始化,否则会导致编译错误。
- ⾮限定通配符表⽰可以⽤任意泛型类型来替代,类型为
泛型中 K T V E ?的含义
E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的 java 类型(无限制通配符类型)
S、U、V - 2nd、3rd、4th types
List