简单学习Java泛型

作者: 鲨鱼尤德曼 | 来源:发表于2020-05-26 16:38 被阅读0次

    为什么使用泛型

    1. 在编译时进行更强的类型检查
    2. 消除类型转换
      以下对比:
    List list=new ArrayList();
    list.add("hello");
    Strings= (String) list.get(0);
    
    List<String> list=new ArrayList<String>();
    list.add("hello");
    String s=list.get(0);   // no cast
    

     

    原始类型(Raw Types)

    Box rawBox=new Box();
    

    原始类型编译时不会进行类型检查,从而将不安全代码的捕获推迟到运行时。因此,应避免使用原始类型。
     

    通配符 (Wildcards)

    上限通配符 (Upper Bounded Wildcards)

     限定类型为T和它的子类,只读。

    Plate<? extends T>
    
    下界通配符类型 (Lower Bounded Wildcards)

     限定类型为T和它的基类,只写。

    Plate<? super T>
    
    无界通配符类型 (Unbounded Wildcards)

    有两种情况下,无界通配符是一种有用的方法:
    1.如果您正在编写可以使用Object class 中提供的功能实现的方法。
    2.当 code 使用泛型 class 中不依赖于 type 参数的方法时。对于 example,List.size或List.clear。实际上,经常使用Class<?>,因为Class<T>中的大多数方法都不依赖于T

    注意:List<String> 不是 List<Object>的子类

    public static void printList(List< ? > list) {
    for (Object elem : list)
        System.out.println(elem+" ");
    System.out.println();
    }
    
     List<String> strList = Arrays.asList("huang", "lan", "kan");
     List<Integer> intList = Arrays.asList(1, 2, 3, 4);
     printList(strList); //正常调用
    

    反面代码 (List<Object>):

    public static void printList(List< Object >list) {
    for (Object elem : list)
        System.out.println(elem+" ");
    System.out.println();
    }
    
     List<String> strList = Arrays.asList("huang", "lan", "kan");
     List<Integer> intList = Arrays.asList(1, 2, 3, 4);
     printList(strList); //同样的代码但是报错
    

    相关文章

      网友评论

        本文标题:简单学习Java泛型

        本文链接:https://www.haomeiwen.com/subject/dflhohtx.html