Java之泛型

作者: Anne_胖达 | 来源:发表于2019-11-06 23:26 被阅读0次

泛型

1.泛型的好处就是统一数据类型,操作更方便,将运行时异常提前至编译时,提高了效率,避免了强制类型的转换,可以将代码模板化,把数据类型当作参数传递,重用性更高了。
常见泛型编程案例RxJava源码的操作符,包括泛型的上下限操作。

定义

public class Shop<T> {
    /**
     * 定义泛型的类或接口,常见的泛型变量用T、R、K、V和E
     * 修饰符class类名或interface接口名 <泛型变量>{
     *
     * }
     */
    private static final String TAG = Shop.class.getSimpleName();

    private ArrayList<T> list = new ArrayList<>();

    /**
     * 方法上包含泛型变量,该泛型变量使用类上定义的泛型
     */
    public void addGood(T  t){
        if (t != null){
            list.add(t);
        }
    }

    public void displayGoods(){
        for (T t : list) {
            LogUtils.e(TAG, "display ==> " + t.toString());
        }
    }

    /**
     * 泛型方法,该泛型变量使用方法上定义的泛型,一般由方法传入的参数决定
     */
    public <E> void display(E e){
        LogUtils.e(TAG,e.toString());
    }

Book类包含id,name,price三个属性,produceBook就是创建该实例对象并且设置相应属性
Pen类包含id,name,price三个属性,producePen就是创建该实例对象并且设置相应属性

public static void main(String[] args){
        Shop<Book> shop = new Shop<>();
        shop.addGood(produceBook("1","Maths",20f));
        shop.addGood(produceBook("2","English",25f));
        shop.addGood(produceBook("3","Java",30f));
        shop.displayGoods();
        shop.display(producePen("1","Black Pen",2f));
}

运行结果

display ==> Book{id=1,name=Maths,price=20.0}
display ==> Book{id=2,name=English,price=25.0}
display ==> Book{id=3,name=Java,price=30.0}
Pen{id='1', name='Black Pen', price=2.0}

泛型的上下限及通配符

使用的泛型类或接口时,如果传递的数据中的泛型类型不确定,可使用通配符<?>表示,但是使用通配符的话,就只能使用一些共性的方法,类似运行时多态,只有调用基类的方法一样。
如果不想使用通配符<?>表示所有类型的话,可以泛型的上下限。
<? extends 类名> 代表只能使用该类和该类的子类,称之为泛型的下限。
<? super 类名> 代表只能使用该类和该类的父类,称之为泛型的上限。

public class Market<T> {
    public void show(Shop<? extends T> shop){
        shop.displayGoods();
    }

    public void display(Shop<? super T> shop){
        shop.displayGoods();
    }
}

Bag、BrandBag、BargainPriceBag三个类分为包、品牌名、特价包,produce相关方法如上,继承关系分别为BargainPriceBag继承BrandBag,BrandBag继承Bag

public static void main(String[] args){
        Shop<Bag> bagShop = new Shop<>();
        bagShop.addGood(produceBag("1","Red Bag",25f));
        bagShop.addGood(produceBag("2","Blue Bag",25f));

        Shop<BrandBag> brandBagShop = new Shop<>();
        brandBagShop.addGood(produceBrandBag("1","Black Bag",500f,"LV"));
        brandBagShop.addGood(produceBrandBag("2","Black Bag",500f,"Gucci"));

        Shop<BargainPriceBag> bargainPriceBagShop = new  Shop<>();
        bargainPriceBagShop.addGood(produceBargainPriceBag("1","Black Bag",500f,"LV",250f));
        bargainPriceBagShop.addGood(produceBargainPriceBag("2","Red Bag",500f,"LV",200f));

}

运行结果

use ? super T
display ==> Bag{id=1,name=Red Bag,price=25.0}
display ==> Bag{id=2,name=Blue Bag,price=25.0}
display ==> BrandBag{id=1,name=Black Bag,price=500.0,brand=LV}
display ==> BrandBag{id=2,name=Black Bag,price=500.0,brand=Gucci}
use ? extends T
display ==> BrandBag{id=1,name=Black Bag,price=500.0,brand=LV}
display ==> BrandBag{id=2,name=Black Bag,price=500.0,brand=Gucci}
display ==> BrandBag{id=1,name=Black Bag,price=500.0,brand=LV,bargainPrice=250.0}
display ==> BrandBag{id=2,name=Red Bag,price=500.0,brand=LV,bargainPrice=200.0}

相关文章

  • Java泛型教程

    Java泛型教程导航 Java 泛型概述 Java泛型环境设置 Java泛型通用类 Java泛型类型参数命名约定 ...

  • Java中的泛型/范型

    维基百科中关于Java泛型的描述 Java 泛型的参数只可以代表类,不能代表个别对象。由于Java泛型的类型参数之...

  • Java高级语言特性之泛型

    Java高级语言特性之泛型 Java泛型(generics)是JDK 5中引入的一个新特性,泛型提供了编译时类型安...

  • Java基础之泛型

    Java基础之泛型 泛型基本介绍 简单介绍在jdk1.6之前,还没有使用到泛型,Java类型分为原始类型、复杂类型...

  • 第二十八课:泛型

    泛型出现之前 泛型出现之后 Java深度历险(五)——Java泛型

  • Kotlin 泛型

    说起 kotlin 的泛型,就离不开 java 的泛型,首先来看下 java 的泛型,当然比较熟悉 java 泛型...

  • java泛型中类型擦除的一些思考

    java泛型 java泛型介绍 java泛型的参数只可以代表类,不能代表个别对象。由于java泛型的类型参数之实际...

  • 详解Java泛型之4——一个例子理解泛型带来的好处

    前面我介绍了关于泛型、通配符以及泛型擦除的相关知识点,大家可以参考以下文章: 详解Java泛型之1——入门泛型必懂...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

  • Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型

    Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型 在代码进入和离开的边界处,会处理泛型 Java泛型作...

网友评论

    本文标题:Java之泛型

    本文链接:https://www.haomeiwen.com/subject/iwwpbctx.html