乐趣区

关于java:理解泛型

  • 为什么要用泛型?

    • 别让猫别站在狗队里
    • Demo

            // 下列的增加办法齐全没问题
            list.add("one");
            list.add(1);
           ​
            // 取的时候, 如果你小心的, 也没问题
            // 须要强转, 外部是以 Object 援用来寄存
            String s = (String) list.get(0);
            int    i = (int) list.get(1);
           ​
            // 然而如果, 不小心在获取时 类型判断出错的话
            for (int index = 0; index < list.size(); index++) {String str = (String) list.get(index);
            // index = 1 时, 抛出 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
            }
  • 泛型的分类

    • 泛型类

      •   private T obj;
          public Holder(T t) {obj = t;}
          public void put(T t) {obj = t;}
          public T get() {return obj;}
         }
    • 泛型接口
    • 泛型办法

      •  public class Normal {
          // 成员泛型办法
          public <E> String getString(E e) {return e.toString();
          }
          // 动态泛型办法
          public static <V> void printString(V v) {System.out.println(v.toString());
          }
         }
         // 泛型类中的泛型办法
         public class Generics<T> {
          // 成员泛型办法
          public <E> String getString(E e) {return e.toString();
          }
          // 动态泛型办法
          public static <V> void printString(V v) {System.out.println(v.toString());
          }
         }
  • 泛型的做用

    • 可能对类型进行限定
    • 在编译期对类型进行查看, 编译时报错
    • 对于获取明确的限定类型, 无需进行强制类型转化
    • 具备良好的可读性和安全性
  • 通配符

    • 协变和逆变

      •  f(⋅) 是逆变(contravariant)的,当 A≤B 时有 f(B)≤f(A) 成立;
         f(⋅) 是协变(covariant)的,当 A≤B 时有 f(A)≤f(B) 成立;
    • 上界通配符 —— 协变

      • <? extends>
    • 下界通配符 —— 逆变

      • <? super>
  • 留神点

    • 泛型类中静态方法不能应用泛型参数
    • 泛型接口中不能应用类型参数作为成员变量
  • 实现原理即类型擦除

    • 泛型只是给编译器用来查看类型的
  • 参考

    • java 泛型深度解读
    • Java 中的逆变与协变
    • java 泛型 通配符详解及实际
    • Java 泛型 T,E,K,V,?,傻傻分不清?
退出移动版