zoukankan      html  css  js  c++  java
  • 泛型2

    万用字符(wildcard)

    以动物Animal类为例,怎样才能创建出一种ArrayList<?>里面既可以保存ArrayList<Dog>,又可以保存ArrayList<Cat>?

    public void takeAnimals(ArrayList<? extends Animal> animals){  //泛型中extends同时代表继承和实现。

        for(Animal a : animals){

            a.eat();

        }

    }

    我们可以这样调用该函数:

    ArrayList<Cat> cat = new ArrayLIst<Cat>();

    cat.add(new Cat());

    cat.add(new Cat());

    cat.add(new Cat());

    takeAnimals(cat);

    也可以这样调用:

    ArrayList<Dog> dog = new ArrayLIst<Dog>();

    dog.add(new Dog());

    dog.add(new Dog());

    dog.add(new Dog());

    takeAnimals(dog);

    但是,请记住!在使用ArrayList<? extends Animal>的时候,编译器会阻止任何可能破坏引用参数所指集合的行为:

    你能够调用引用参数中的任何对象,但不能加入新元素。

    比如:animals.add(new Cat()); 就过不了编译关。

    同样的实现,还有另一种写法:

    public <T extends Animal> void takeThing(ArrayList<T> list) 和 

    public void takeThing(ArrayList<? extends Animal> list) 执行是一样一样的。

    为什么这里一个用T一个用?

    举个例子:

    public <T extends Animal> void takeThing(ArrayList<T> one, ArrayList<T> two)

    public void takeThing(ArrayList<? extends Animal> one, ArrayList<? extends Animal> two)

    如果两个参数都是extends自Animal那么只声明一次会比较有效率。

  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/lanshanxiao/p/7173066.html
Copyright © 2011-2022 走看看