zoukankan      html  css  js  c++  java
  • 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"));
     




      

  • 相关阅读:
    anconda + python 3.6安装(以前的anconda,anaconda和python版本对应关系)
    数学建模python matlab 编程(喷泉模拟)
    使用git checkout 指定git代码库上的指定分支
    aapt命令获取apk具体信息(包名、版本号号、版本号名称、兼容api级别、启动Activity等)
    toad for oracle中文显示乱码
    storm是怎样保证at least once语义的
    记使用WaitGroup时的一个错误
    Drupal 初次使用感受,兴许补充。
    Qt 5.5.0 Windows环境搭建
    有趣的Ruby-学习笔记3
  • 原文地址:https://www.cnblogs.com/zhangchenglzhao/p/6794826.html
Copyright © 2011-2022 走看看