<java泛型>java泛型Generics
2019独角兽企业重金招聘Python工程师标准>>>
what
泛型:一般类型,也就是说可以为任何类型.
泛型的本质是“参数化类型”,也就是说: 所操作的数据类型 被指定为一个参数, 传输。泛型是在JDK1.5中引入的特性。
why
泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型,而不是在运行时才出现错误。
使用泛型有以下好处:
- 编译时强类型检查
- 无需手动进行类型转换
- 可以实现复用,编写通用算法
how
泛型类
ArrayList
public class Tool<E> {
private E e;
public Tool(E e1){
this.e = e1;
}
public E getE() {
return e;
}
public void setE(E e) {
this.e = e;
}
}
泛型方法
1)使用泛型类定义参数类型(常用)
如泛型类Tool
public class Tool<AA>{
public void show(AA aa){
}
}
2)自定义的参数类型
public <AA> void show(AA aa){
}
注:静态方法不能访问类的泛型,如果需要泛型,我们只能使用方法2(自定义的参数类型)
泛型接口
假设有泛型接口interf
1)确定实现的泛型接口的参数类型:
假设Tool类需要String类型的参数,那么实现可以直接写:
class Tool implements interf<String>{
}
2)不确定实现的泛型接口的参数类型:
我们需要泛型类来实现
class Tool<BB> implements interf<BB>{
}
当泛型类和泛型方法一起出现的时候
泛型T 被实现类所指定的泛型类型替换,而参数e是由调用者决定的
public interface Test<T> {
<E> T aaa(E e, T t);
}
public class Demo implements Test<Integer> {
@Override
public <E> Integer aaa(E e, Integer t) {
return null;
}
}
当然返回类型也可更改为E
public interface Test<T> {
<E> E aaa(E e, T t);
}
public class Demo implements Test<Integer> {
@Override
public <E> E aaa(E e, Integer t) {
return null;
}
}
泛型通配符:?
当我们不确定传入的对象类型时我们就可以使用?来代替。“?”即泛型通配符。
泛型的限定
书写格式:
上限:<? extends E> 表示参数类型是 E或其所有子类。
下限:<? super E> 表示参数类型是 E或其所有超类(即父类)。
约定俗成的定义
? 表示不确定的java类型。
T 表示java类型。
K, V 分别代表java键值中的Key Value。
E 代表Element。
#
#
泛型的擦除
一句话总结就是:在.java文件运用泛型技术时,编译器在文件编译通过后自动擦除泛型标识。
泛型的补偿
编译器在擦除泛型后,会自动将类型转换为原定义的”泛型”,这样就不必再做向下类型转换了。 泛型的擦除和补偿 这两个机制都是编译器内部自动完成的,了解其原理即可。
转载于//my.oschina.net/u/3970972/blog/3030494
还没有评论,来说两句吧...