Java中的泛型、枚举和注解

1.泛型:

一、为什么要有泛型(Generic)?
1.解决元素存储的安全性问题
任何类型都可以添加到集合中:类型不安全
2.解决获取数据元素时,需要类型强转的问题
读取出来的对象需要强转:繁琐可能有ClassCastException

1.泛型的声明
interface List<T> 和 class TestGen<K,V>
其中,T,K,V不代表值,而是表示类型。这里使
用任意字母都可以。常用T表示,是Type的缩写。

2.泛型的实例化:
一定要在类名后面指定类型参数的值(类型)。如:
List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();

对象实例化时不指定泛型,默认为:Object

二、自定义泛型类

class Person<T>{
    //使用T类型定义变量
    private T info;
    //使用T类型定义一般方法
    public T getInfo(){
        return info;
    }
    public void setInfo(T info){
        this.info = info;
    }
    //使用T类型定义构造器
    public Person(){}
    public Person(T info){
        this.info = info;
    }
    //static的方法中不能声明泛型
    //public static void show(T t){
    //}
    //不能在try-catch中使用泛型定义
    //try{}
    //catch(T t){}        
}

三、通配符:

1.使用类型通配符:?
比如:List<?> ,Map<?,?>
List<?>是List<String>、List<Object>等各种泛型List的父类。

2.不能直接向List<?>,Map<?,?>写入list中的元素。因为我们不知道元素类型,我们不能向其中添加对象。
唯一的例外是null,它是所有类型的成员

2.枚举:

JDK1.5之前需要自定义枚举类
JDK 1.5 新增的 enum 关键字用于定义枚举类
若枚举只有一个成员, 则可以作为一种单例模式的实现方式

枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰
枚举类的使用 private final 修饰的属性应该在构造器中为其赋值
若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数

必须在枚举类的第一行声明枚举类对象

枚举类和普通类的区别:
使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
枚举类的构造器只能使用 private 访问控制符
枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰

枚举类的主要方法:
values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”(如上图中的“SPRING”)。如不是,会有运行时异常。

3.注解:

定义新的 Annotation 类型使用 @interface 关键字
Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明. 其方法名和返回值定义了该成员的名字和类型.
可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用 default 关键字
public @interface MyAnnotation{
  String name() default “lhf";
}

原文地址:https://www.cnblogs.com/pjlhf/p/8658639.html