安卓泛型的使用

文章目录


前言

我们为什么需要泛型?
在JDK1.5之前是没有泛型的,其实这也并不影响我们的正常功能开发,但是我们需要用到大量的类型强制,运行时一旦强转错误就是导致程序崩溃,那么能不能在编译时就把这些检查做好呢?答案就在泛型中。


所谓“泛型”,就是“宽泛的数据类型”,任意的数据类型。

java中的泛型是语法糖,只存在编译阶段。

泛型最主要的作用就是通过指定参数类型,使编译器可以在编译期间检查程序中是否有类型转换的错误。


一、泛型定义的初始化位置

1.类

定义:


    //1.定义在类中
    static class KeyStore<K, V> {
        private V value;
        private K key;

        public KeyStore(K key, V value) {
            this.key = key;
            this.value = value;
        }


        public K GetKey() {
            return key;
        }

        public <A> ArrayList<A> test(ArrayList<A> parms1) {
            return parms1;
        }

        public <A> A test2(A parms1) {
            return parms1;
        }

    }

使用:


 KeyStore<Integer, String> keyStore = new KeyStore<>(1, "");

2.接口

我们有两种方式来实现这个接口

在定义实现类时不明确类型参数,在创建对象时才明确类型参数
在定义实现类时明确类型参数

    //2.定义在接口中
    interface IKeyStroe<K, V> {
        void printKeyStroe(K key, V value);
    }

    // 2.1 定义实现接口的类时,不确定泛型参数类型,在创建时候才明确
    static class KeyStore1<K, V> implements IKeyStroe<K, V> {

        public KeyStore1(K key, V value) {
        }

        @Override
        public void printKeyStroe(K key, V value) {

        }
    }

    // 2.1 定义实现接口的类时,确定泛型参数类型,可在类定义时候明确
    static class KeyStore2 implements IKeyStroe<Integer, String> {

        public KeyStore2(Integer key, String value) {

        }

        @Override
        public void printKeyStroe(Integer key, String value) {

        }
    }


3.方法

        public <A> ArrayList<A> test(ArrayList<A> parms1) {
            return parms1;
        }

        public <A> A test2(A parms1) {
            return parms1;
        }
        
      public static <K, V> boolean compare(KeyStore<K, V> map1, KeyStore<K, V> map2) {
        return Objects.deepEquals(map1, map2);
    }


二、泛型定义的限制类型(extend)

在类、 接口、方法中都可以使用extend关键字限制参数类型
举例:

    //1.定义在类中
    static class KeyStore<K, V extends ArrayList> {
        private V value;
        private K key;

        public KeyStore(K key, V value) {
            this.key = key;
            this.value = value;
        }


        public K GetKey() {
            return key;
        }

        public <A extends Number> ArrayList<A> test(ArrayList<A> parms1) {
            return parms1;
        }

        public <A extends String> A test2(A  parms1) {
            return parms1;
        }



三、泛型使用时的不确定类型声明(通配符 ’ ?’)

我们一般把通配符用在实例化对象时候依然不确定泛型类型上。
我们虽然不确定其具体类型,但是有可能知道其限定条件,因为又
分为有上限的通配符(? extend xxx)有下限的通配符(? super xxx)

        ArrayList<?> test = keyStore.test(new ArrayList<Integer>());
        ArrayList<? extends Number> t1 = keyStore.test(new ArrayList<Integer>());
        ArrayList<? extends Number> t2 = keyStore.test(new ArrayList<Integer>());
        ArrayList<? super Integer>  t3 = keyStore.test(new ArrayList<Number>());
        ArrayList<? super Integer>  t4 = keyStore.test(new ArrayList<Integer>());

  // 通配符
    public static void print1(KeyStore<?, ?> map1) {
        System.out.println(map1.key + ";" + map1.value);
    }

    public static void print2(KeyStore<? extends Number, ?> map1) {
        System.out.println(map1.key + ";" + map1.value);
    }

    public static void print3(KeyStore<? super Number, ?> map1) {
        System.out.println(map1.key + ";" + map1.value);
    }
上一篇:解决:Redis:java.util.NoSuchElementException: Unable to validate object at


下一篇:C++关于构造函数的深拷贝与浅拷贝