• Java 理解泛型的基本含义


    Java 泛型

    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

    泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。


    泛型方法

    你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

    下面是定义泛型方法的规则:

    • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的<E>)。
    • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
    • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
    • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。

    实例:

    public class ElementDemo {
        
        public static void main(String[] args) {
            
            //<Integer>运行时类型
            //使用泛型后,如果实例化是定义的类型与对象传入的类型不一致,就会在编译时期报错。
            Test<Integer> t1 = new Test<>();
            t1.add(666); 
            
            Test<String> t2 = new Test<>();
            t2.add("cjj");
        }
    }
    
    /**
     * "E" 在这里并没有实际意义,你也可以用别的字母代替
     * 它的作用就是在实例化Test类的时候,传入什么类型它就调用什么类型
     */
    class Test<E>{
        public void add(E e) {
            
            System.out.println(e);
        }
    }

    注意:

    泛型的命名只要符合标识符的命名规则即可
    习惯上泛型一般只使用一个大写字母进行命名

        <T> type
        <E> element 元素类型
        <K> key
        <V> value
        <R> result/return

    泛型向下兼容

    <? extends 类/接口>

    import java.util.ArrayList;
    import java.util.List;
    
    public class ElementDemo {
        public static void main(String[] args) {
            
            //实例化一个Integer类型的数组列表对象,里面存储的数据都是int型数据
            List<Integer> in = new ArrayList<>();
            in.add(1);
            in.add(2);
            in.add(3);
            in.add(4);
            in.add(5);
            in.add(6);
            //实例化一个Double类型的数组列表对象,里面存储的数据都是Double类型的
            List<Double> dos = new ArrayList<>();
            dos.add(3.6);
            dos.add(4.2);
            dos.add(6.8);
            dos.add(7.7);
            dos.add(0.2);
            
            //调用方法
            print(in);
            print(dos);
        }
        
        // 写一个新的方法来遍历元素类型是数字的列表
        // 元素类型是Number或者是其子类
        // ? extends 类/接口 表示传入这个类/接口或者是其子类/子接口对象
        // 所能传入的元素的最大类型限定为Number
        // 规定了泛型的上限
        public static void print(List<? extends Number> list) {
            
            //在方法体里面不能再往对象里添加元素,null除外
            list.add(null);
            
            //打印对象里面的元素
            System.out.println(list);
        }
    }

    向上造型规定了泛型的上限,上限的子类都可以向泛型方法传入对象。

    泛型向下兼容

    <? extends 类/接口>

    import java.util.ArrayList;
    import java.util.List;
    
    public class ElementDemo1 {
        public static void main(String[] args) {
            
            List<String> str = new ArrayList<>();
            str.add(0, "cjj");
            
            print(str);
        }
        
        // 泛型的下限
        // 传入元素类型是String及其父类的列表
        // ? super 类/接口 表示传入这个类/接口及其父类/父接口的对象
        // 表示传入的最小类型是String    
        public static void print(List<? super String> list) {
            
            //方法体里面可以添加元素
            list.add("add");
            
            for(Object o : list){
                System.out.println(o);
            }
        }
    }

    向上造型规定了泛型的下限,下限的fu类都可以向泛型方法传入对象。

  • 相关阅读:
    Linux XZ格式的解压
    Linux eject弹出光驱
    什么是错误链接/死链接
    什么是相对地址和绝对地址
    网站被K或者降权后应该如何恢复
    网络营销怎么做才有“钱”途
    如何通过seo技术提高网站对用户的友好度
    如何利用微博客进行seo赚钱营销
    做SEO必须制定超越竞争对手网站的方案
    文章很快收录后又被删除的原因
  • 原文地址:https://www.cnblogs.com/chuijingjing/p/9509367.html
Copyright © 2020-2023  润新知