泛型的本质是参数化类型,所操作的数据类型被指定为一个参数。
例:
package Demo;
import java.util.ArrayList;
public class Demo314_7 {
public static void main(String args[]){
ArrayList al=new ArrayList();
al.add("Hello");
al.add(new Double(1.2));
al.add(new Object());
String s=(String)al.get(1);
}
}
运行时异常:Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
at Demo.Demo314_7.main(Demo314_7.java:11) double类型不能被转换为string类型
在没有泛型的情况下 引用Object类来实现参数的任意化(Object类是所有类的父类),实现强制类型转换,这种转换是在参数类型可以预知的情况下进行的
而泛型是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
定义泛型:LinkedList<E> 有一个类型参数E,表示这个list对象的存储的元素类型
类型参数用通配符<?>
Collection<?>表明Collection的元素为未知类型 只能使用Object类型访问未知类型,不能向未知类型集合中添加除Null以外的任何未知类型的对象
泛型方法:是否有泛型方法,与其所在的类是否泛型没有关系。要定义泛型方法,只需要讲泛型参数列表置于返回值前
通配符<?> ?表示一个未知类型,类型List<?>被读作List of unknown
类型参数用通配符<?> Collection<?>表明Collection的元素为未知类型,只能使用Object类型访问未知类型,不能向未知类型集合中添加除null以外任何类型的对象
泛型方法: 是否拥有泛型方法,与其所在的类是否泛型没有关系,要定义泛型方法,只需将泛型参数列表置于返回值前
定义泛型方法时,必须在返回值前边加一个<T>,来声明这是一个泛型方法,持有一个泛型T然后才可以用泛型T作为方法的返回值。
泛型的类型参数只能是类类型 (包括自定义类)
枚举:枚举其实就是一种类型,跟int char这种差不多,就是定义变量时限制输入的,你只能赋enum里面规定的。定义枚举:定义了一堆常量,必须遵守多种“类型安全枚举模式”的一种
所有的枚举类型继承自java.lang.Enum 枚举类就是class,而且是一个不可以被继承的final类(全部大写),既然枚举类是class,当然在枚举类型中有构造器,方法和数据域
构造器只是在构造枚举值的时候被调用,构造器只能私有private,绝对不允许有pulic 构造器 enum不能使用extends 关键字继承其他类,因为enum已经继承了java.lang.enum是单一继承