zoukankan      html  css  js  c++  java
  • 廖雪峰Java4反射与泛型-3范型-5extends通配符

    1.泛型的继承关系:

        Pair<Integer>不是Pair<Number>的子类
        add()不接受Pair<Integer>
    

    Pair.java

    package com.testArray;
    
    public class Pair<T> {
        private T first;
        private T last;
        public Pair(T first,T last){
            this.first = first;
            this.last = last;
        }
        public void setFirst(T first){
            this.first = first;
        }
        public T getFirst() {
            return first;
        }
        public void setLast(T last){
            this.last = last; 
        }
        public T getLast(){
            return last;
        }
    }
    
    public class PairHepler {
        static int add(Pair<Number> p){
            Number first = p.getFirst();
            Number last = p.getLast();
            return first.intValue() + last.intValue();
        }
    }
    

    2.extends通配符

    2.1extends通配符的第一种用法

       如果想要add接收Pair.Integer、Pair.Float、Pair.Double,将Pair类型修改为<? extends Number>使方法接收所有泛类型为Number或Number子类的Pair类。
    
    package com.testArray;
    
    public class PairHepler {
        static int add(Pair<? extends Number> p){
            Number first = p.getFirst();
            Number last = p.getLast();
            return first.intValue() + last.intValue();
    
        }
    }
    
    ```#log 1.对Pair调用getFirst()方法: 方法签名:?extends Number getFirst() 可以安全赋值给Number类型的变量:Number x = p.getFirst() 不可预测实际类型就是Integer:Integer x = p.getFirst();会报错,必须用Number 2.对Pair调用setFirst()方法: 方法签名:void setFirst(? extends Number) 无法传递任何Number类型给setFirst(? extends Number) 3.因此的通配符: 允许调用get方法获得Number的引用 不允许调用set方法传入Number的引用 唯一例外:可以调用setFirst(null) ``` ```#java package com.testArray;

    public class PairHepler {
    static int add(Pair<? extends Number> p){
    Number first = p.getFirst();
    Number last = p.getLast();
    p.setFirst(null);
    p.getFirst();
    return first.intValue() + last.intValue();
    /**
    * 但不能预测实际类型就是Integer:
    * Integer x = p.getFirst();
    * void setFirst(? extends Number)
    * 无法传递任何Number类型给setFirst(? extends Number)
    */
    }
    }

    ###    2.2extends通配符的第二种用法
    ```#log
    定义泛型类是public class Pair<T extends Number>{}:
    限定T只能是Number或Number的子类
    
    public class Pair<T extends Number>{...}
    Pair<Number> ip = new Pair<>(1, 2);
    Pair<Double> dp = new Pair<>(1.2, 3.4);
    Pair<String> sp = new Pair<>('a', 'b');//error
    

    3.总结:

    • 使用类似<? extends Number>通配符作为方法参数时表示:
      * 方法内部可以调用获取Number引用的方法: n = obj.getXXX()
      * 方法内部无法调用传入Number应用的方法,null除外:obj.setXX(Number n)
    • 使用类似定义泛型类时表示:
      * 泛型类型限定为Number或Number的子类
  • 相关阅读:
    [HTML5] document.hidden
    在vue页面中设置resize事件
    document之ES6解构
    vue中mixins的使用方法和注意点---mixins第二篇(异步请求的情况)
    vue中mixins的使用方法和注意点---mixins第一篇
    vue中路由重定向redirect
    如何理解dispatch( 'tagsView/delAllViews',null,{root:true} )里面的root:true
    vue计算属性computed中的get和set的使用
    splice(0)的奇妙用法
    4月5日学习日志
  • 原文地址:https://www.cnblogs.com/csj2018/p/10426464.html
Copyright © 2011-2022 走看看