• java 泛型: 通配符? 和 指定类型 T


    1. T通常用于类后面和 方法修饰符(返回值前面)后面 ,所以在使用之前必须确定类型,即新建实例时要制定具体类型, 而?通配符通常用于变量 ,在使用时给定即可

    ? extends A  :  通配符上界   通常用于参数,来界定传入的参数上界,不能对参数进行变更,因为无法确定参数的具体类型。 

    public class A{
    	public void act(List<? extends Animal> list) {
    		for (Animal animal : list) {
    			animal.eat();
    		}
    	}
    }
    
    
    
    public class ATest{
    	public static void main(String[] args) {
    		A a= new A();
    		//Test 1
    		List<Animal> animalList = new ArrayList<>();
    		animalList.add(new Cat("cat1"));
    		animalList.add(new Bird("bird1"));
    		
    		a.act(animalList);	//可以通过编译
    		
    		//Test 2
    		List<Cat> catList = new ArrayList<>();
    		catList.add(new Cat("cat2"));
    		catList.add(new Cat("cat3"));
    		
    		a.act(catList);		//也可以通过编译
    	}
    }

    对act 方法 传递 任何 继承Animal 的list 对象都是可以的。
    但也正是 因为参数具体类型的不确定,所以无法对改参数进行更新操作,如add元素, 如add(cat),单数参数 可能是 List<dog>,List<cat>,List<animal> ,虽然第2,3 种是可以执行add(cat) 的,但是第1中是无法执行的,由于这种
    不确定性,为了安全,java 禁止向该参数添加任何对象,除了null.




    ? supper B 通配符上界,不仅可以传递任何B及其父类。还可以对参数进行添加 B 及其子类,原因: 该参数可能是B,B父类, 由于子类可以指向父类,那么就是说我对参数添加一个B或者B的子类是可行的,就如List<B> l = new ArrayList<>(); l.add(B);l.add(Bchild),是正确的。


    // 可以正确执行, 其效果就如2
    public void testAdd(List<? super Bird> list){
    		list.add(new Bird("bird"));
    		list.add(new Magpie("magpie")); //Magpie 是Bird 的子类
    }

    //2 可以执行
    List<? super Bird> list = new ArrayList<>();
    list.add(new Bird("bird"));
    list.add(new Magpie("magpie"));
    list.add(new Animal("animal"));
     




      

  • 相关阅读:
    memory runs at single channel问题解决
    ASP php获取文件URL地址等方法
    zencart的modules下数据库操作templates排版和common首页引用
    php生成html 伪静态??
    Linux服务器自动备份压缩MySQL数据库的实用方法
    dos 命令集
    Zencart 500错误查找和解决方法
    破解JS加密:url unicode加密而已
    .htaccess 保护文件夹
    TCP 的那些事儿(上)
  • 原文地址:https://www.cnblogs.com/zhangchenglzhao/p/6794826.html
Copyright © 2020-2023  润新知