<java泛型>java泛型Generics

快来打我* 2022-10-02 00:49 442阅读 0赞

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

what

泛型:一般类型,也就是说可以为任何类型.

泛型的本质是“参数化类型”,也就是说: 所操作的数据类型 被指定为一个参数, 传输。泛型是在JDK1.5中引入的特性。

why

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型,而不是在运行时才出现错误。

使用泛型有以下好处:

  • 编译时强类型检查
  • 无需手动进行类型转换
  • 可以实现复用,编写通用算法

how

泛型类

ArrayList

  1. public class Tool<E> {
  2. private E e;
  3. public Tool(E e1){
  4. this.e = e1;
  5. }
  6. public E getE() {
  7. return e;
  8. }
  9. public void setE(E e) {
  10. this.e = e;
  11. }
  12. }

泛型方法

1)使用泛型类定义参数类型(常用)

如泛型类Tool,它的泛型参数即为AA。那么泛型方法可以这样写:

  1. public class Tool<AA>{
  2. public void show(AA aa){
  3. }
  4. }

2)自定义的参数类型

  1. public <AA> void show(AA aa){
  2. }

注:静态方法不能访问类的泛型,如果需要泛型,我们只能使用方法2(自定义的参数类型)

泛型接口

假设有泛型接口interf,它的实现类是Tool。

1)确定实现的泛型接口的参数类型:

假设Tool类需要String类型的参数,那么实现可以直接写:

  1. class Tool implements interf<String>{
  2. }

2)不确定实现的泛型接口的参数类型:

我们需要泛型类来实现

  1. class Tool<BB> implements interf<BB>{
  2. }

当泛型类和泛型方法一起出现的时候

泛型T 被实现类所指定的泛型类型替换,而参数e是由调用者决定的

  1. public interface Test<T> {
  2. <E> T aaa(E e, T t);
  3. }
  4. public class Demo implements Test<Integer> {
  5. @Override
  6. public <E> Integer aaa(E e, Integer t) {
  7. return null;
  8. }
  9. }

当然返回类型也可更改为E

  1. public interface Test<T> {
  2. <E> E aaa(E e, T t);
  3. }
  4. public class Demo implements Test<Integer> {
  5. @Override
  6. public <E> E aaa(E e, Integer t) {
  7. return null;
  8. }
  9. }

泛型通配符:?

当我们不确定传入的对象类型时我们就可以使用?来代替。“?”即泛型通配符。

泛型的限定

书写格式:

  1. 上限:<? extends E> 表示参数类型是 E或其所有子类。
  2. 下限:<? super E> 表示参数类型是 E或其所有超类(即父类)。

约定俗成的定义

? 表示不确定的java类型。
T 表示java类型。
K, V 分别代表java键值中的Key Value。
E 代表Element。

#

#

泛型的擦除

一句话总结就是:在.java文件运用泛型技术时,编译器在文件编译通过后自动擦除泛型标识。

泛型的补偿

编译器在擦除泛型后,会自动将类型转换为原定义的”泛型”,这样就不必再做向下类型转换了。 泛型的擦除和补偿 这两个机制都是编译器内部自动完成的,了解其原理即可。

转载于:https://my.oschina.net/u/3970972/blog/3030494

发表评论

表情:
评论列表 (有 0 条评论,442人围观)

还没有评论,来说两句吧...

相关阅读

    相关 (Generic) 的优点

    泛型引入前编程的痛点 `JDK 1.5` 版本以前没有泛型,使用 Object 来实现不同类型的处理,有两个缺点 1、每次使用时都需要`强制转换`; 2、在`编译