泛型

泛型, 类似于C++中的模板。使用泛型, 能够提高程序中数据类型的兼容性,避免代码中频繁更改数据类型。也可以使用泛型,构造自己的想要的,较为复杂的数据类型。

函数中, 参数使用泛型

考虑这样一个场景: 我们要给 NumGeneric 对象 中一个成员变量num赋值, 但是num的数据类型我们还不确定。它可能是int ,也可能是 float, 还可能是别的类型。此时我们对于这种不确定的数据类型, 可以用泛型代替。泛型的使用,需要在 类名 后加入 < > 体现出来。如下面的public class NumGeneric<E>。

public class NumGeneric<E> {

    private E num;

    public NumGeneric(E num) {
        this.num = num;
    }

    public E getNum() {
        return num;
    }

    public static void main(String[] args) {

        NumGeneric<Double> numObj= new NumGeneric<>(25.0);

        System.out.println("Num : "+ numObj.getNum());

    }
}

自定义泛型

有时候, 基础的数据类型很难满足我们的实际需求。我们需要构建自己的泛型。

考虑以下的场景: 有一个 抽象类 Goods, 还有一个 Book 类继承 Goods 类, 还有一个 Shoes 类也继承 Goods 类。有一个 GoodsSellor 类 用于销售多件商品, 但是具体销售什么商品不确定,有可能销售 Book 对象, 也有可能销售 Shoes 对象,也有可能两种商品都有。这时我们在 GoodsSellor 传入参数是, 可以用泛型 <? extends Goods> 代替 具体的 商品类型。<? extends Goods> 表示任何一种继承 Goods 的类型。

编写Goods 类, 设置成是抽象类, 不能被实例化, 专门用来给子类继承

public abstract class Goods {
    public abstract void sell();
}

编写 Book 类, 继承 Goods 类

public class Book extends Goods {

    @Override
    public void sell() {
        System.out.println("sell books");
    }
    
}

编写 Shoes 类,继承 Goods 类

public class Shoes extends Goods {
    @Override
    public void sell() {
        System.out.println("sell shoes");
    }
}

编写 GoodsSeller 类, 用来销售 Goods 的子类

我们使用了 <? extends Goods> 来代替 Goods 的所有子类

public class GoodsSeller  {

    public GoodsSeller() {
    }

    public void sellGoods(List<? extends Goods> goods) {

        for(Goods g:goods) {
            g.sell();
        }

    }

    public static void main(String[] args) {
        GoodsSeller gs=new GoodsSeller();

        List<Goods> goods=new ArrayList<>();
        goods.add(new Shoes());
        goods.add(new Book());

        gs.sellGoods(goods);
        //输出 :
        //sell shoes
        //sell books
    }


}

Last updated