泛型是指参数化类型的能力,使用泛型的主要优点是能够在编译时而不是运行时检查到错误
泛型类型必须是引用类型,不能用像int,double,或者char这样的基本类型来替换泛型类型
因为某些错误能在编译时而不是运行时被发现
关于泛型在构造方法方面的易错点
public Mystack<T>() 这是错误的,应该定义为public Mystack()
除了可以定义泛型接口,还可以定义泛型类,泛型方法。
例如:
GenericMethodDemo.<Integer>print(integers);
GenericMethodDemo.<String>print(strs);
!一般将一个类定义为泛型类,那么其方法也没必要特别定义为泛型方法
原始类型和向后兼容
不使用类型参数的泛型类称为原始类型
通配泛型
通配泛型有3中形式 ?,? extends T或者? super T
第一种类型?称为非受限通配,他和? extends object 是一样的
第二种类型 ? extends T称为受限通配,第三种称为下限通配
消除泛型和对泛型的限制
泛型是使用一种称为类型消除的方法来实现的。编译器使用泛型类型信息来编译代码,但是随后会消除他。泛型存在于编译时,一旦编译器确定泛型类型安全后,就会将它
转换为原始类型
并不是所有情况下都可以使用泛型,比如
1.不能使用new E()
2.不能使用new E[]
3.在静态环境下不允许类的参数是泛型类型
4.异常类不能是泛型的
泛型类型必须是引用类型,不能用像int,double,或者char这样的基本类型来替换泛型类型
例子:demo1
因为某些错误能在编译时而不是运行时被发现
关于泛型在构造方法方面的易错点
public Mystack<T>() 这是错误的,应该定义为public Mystack()
除了可以定义泛型接口,还可以定义泛型类,泛型方法。
例子:demo2
例如:
GenericMethodDemo.<Integer>print(integers);
GenericMethodDemo.<String>print(strs);
!一般将一个类定义为泛型类,那么其方法也没必要特别定义为泛型方法
原始类型和向后兼容
不使用类型参数的泛型类称为原始类型
通配泛型
通配泛型有3中形式 ?,? extends T或者? super T
第一种类型?称为非受限通配,他和? extends object 是一样的
第二种类型 ? extends T称为受限通配,第三种称为下限通配
消除泛型和对泛型的限制
泛型是使用一种称为类型消除的方法来实现的。编译器使用泛型类型信息来编译代码,但是随后会消除他。泛型存在于编译时,一旦编译器确定泛型类型安全后,就会将它
转换为原始类型
并不是所有情况下都可以使用泛型,比如
1.不能使用new E()
2.不能使用new E[]
3.在静态环境下不允许类的参数是泛型类型
4.异常类不能是泛型的