java video明星分类_分类: java基础 - 程序员老猫

为什么要深入一下泛型?

本人最近开始在深读一些源码,发现有些底层的一下设计理解的不是很透彻,很多优秀的框架用到了各种各样的设计模式外加一些泛型去实现,不审核将泛型进行理解,感觉总是一头雾水。

定义

聊到泛型,我们第一个想到的就是,这个东西到底是干什么的,我想很大一部分小伙伴应该也是仅仅停留在偶尔使用这个水平上面,至于再深入一些,估计能说出来的够呛。书上这么说,泛型,即“参数化类型”。说到参数,我们知道,定义方法的时候是形参,传递实参。那何为参数化类型?对比着上面的理解,其实也很容易,说白了就是将原来的类型进行参数化。操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

特性

泛型只在编译阶段有效。我们看下如下代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16/**

* @Author: maoba

* @Description:

* @Date: 2020-05-27 22:48

*/

public class GenericsDemo{

public static void main(String[] args){

ListstringArrayList = new ArrayList();

ListintegerArrayList = new ArrayList();

Class classStringArrayList = stringArrayList.getClass();

Class classIntegerArrayList = integerArrayList.getClass();

if(classStringArrayList.equals(classIntegerArrayList)){

System.out.println("泛型测试类型相同");

}

}

}

最终我们输出的结果是“泛型测试类型相同”(大家可以直接拷贝本人的代码去运行一下)。这个结果说明了什么呢?说明在编译之后程序会采取去泛型化的措施。明明是不同的类型,但是class字节码却是同一份。也就是说明在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。简而言之,泛型信息不会进入到运行时阶段。

使用

开头的时候我们提到了,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。那么我们就分别来看一下这三种场景下泛型的使用。

泛型类

上述例子提到的List,说白了就是一个泛型类。我们还是自己写一个,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27/**

* @Author: mao ba

* @Description: 泛型类例子

* @Date: 2020-05-27 22:58

* 说明:以下代码,其中"T"的类型都是由外部传入所定

*/

public class GenericsClassDemo{

//内部定义一个T的属性

private T t;

//new出对象的时候传入该参数

GenericsClassDemo(T t){

this.t = t;

}

//再设置一个无参构造器

GenericsClassDemo(){

}

//同样地我们给T这个属性设置GET、SET方法、给 T传递值的时候有两种方式,

//1、通过构造器传递 2、通过set

public T getT(){

return t;

}

public void setT(T t){

this.t = t;

}

}

调用函数:

1

2

3

4

5

6

7

8

9

10

11public class GenericsTestMain{

public static void main(String[] args){

/**说明,以下传入参数,并不是只是规定的String,Integer,Long等等,自定义的类型亦可**/

GenericsClassDemostringGenericsClassDemo = new GenericsClassDemo("测试");

System.out.println(stringGenericsClassDemo.getT());

GenericsClassDemointegerGenericsClassDemo = new GenericsClassDemo();

integerGenericsClassDemo.setT(123);

System.out.println(integerGenericsClassDemo.getT());

}

}

输出结果,分别为:“测试”、“123”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据您提供的配置文件,这是一个用于姿态估计的pose_demo的配置示例。该配置文件包括了处理器配置(processor_cfg)和命令行参数配置(argparse_cfg)。 处理器配置包括以下内容: - type:指定处理器类型为"processor.pose_demo.inference",这可能是一个自定义的处理器类型。 - gpus:指定使用的GPU数量为1。 - worker_per_gpu:指定每个GPU的worker数量为1。 - video_file:指定输入视频的路径为"resource/data_example/skateboarding.mp4"。 - save_dir:指定结果保存的目录路径为"work_dir/pose_demo"。 检测配置(detection_cfg)包括以下内容: - model_cfg:指定检测模型的配置文件路径为"configs/mmdet/cascade_rcnn_r50_fpn_1x.py"。 - checkpoint_file:指定检测模型的checkpoint路径为"mmskeleton://mmdet/cascade_rcnn_r50_fpn_20e"。 - bbox_thre:指定检测目标的边界框阈值为0.8。 估计配置(estimation_cfg)包括以下内容: - model_cfg:指定姿态估计模型的配置文件路径为"configs/pose_estimation/hrnet/pose_hrnet_w32_256x192_test.yaml"。 - checkpoint_file:指定姿态估计模型的checkpoint路径为"mmskeleton://pose_estimation/pose_hrnet_w32_256x192"。 - data_cfg:指定姿态估计模型的数据配置,包括图像尺寸、像素标准化值、图像均值和标准差以及后处理选项。 命令行参数配置(argparse_cfg)包括了一些命令行参数的绑定,用于从命令行传递参数给处理器配置。 例如,您可以使用以下命令行参数来运行pose_demo: ``` python pose_demo.py --gpus 1 --video resource/data_example/skateboarding.mp4 --worker_per_gpu 1 --skeleton_model configs/pose_estimation/hrnet/pose_hrnet_w32_256x192_test.yaml --skeleton_checkpoint mmskeleton://pose_estimation/pose_hrnet_w32_256x192 --detection_model configs/mmdet/cascade_rcnn_r50_fpn_1x.py --detection_checkpoint mmskeleton://mmdet/cascade_rcnn_r50_fpn_20e ``` 请注意,以上仅为示例,具体的使用方式和命令行参数可能会有所不同,具体取决于实际情况。 如果您有进一步的问题,请提供更多细节,我将尽力帮助您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值