精华内容
下载资源
问答
  • 关于numpy的astype(bool)和astype(int)等等

    万次阅读 多人点赞 2019-12-04 15:29:57
    关于numpy的astype(bool)和astype(int)等等 import numpy as np a=[[1,2,1],[2,3,5]] b=[[0,0,0],[2,3,5]] c=np.array(a) d=np.array(b) print(c) print(d) 就是简单的把list列表转化为数组 然后看看加了.as...

    关于numpy的astype(bool)和astype(int)等等

    import numpy as np
    a=[[1,2,1],[2,3,5]]
    b=[[0,0,0],[2,3,5]]
    c=np.array(a)
    d=np.array(b)
    print(c)
    print(d)
    

    运行结果
    就是简单的把list列表转化为数组
    然后看看加了.astype(bool)是什么意思?
    正如astype的中文意思,作为布尔类型,也就是true or false
    代码如下

    import numpy as np
    a=[[1,2,1],[2,3,5]]
    b=[[0,0,0],[2,3,5]]
    c=np.array(a).astype(bool)
    d=np.array(b).astype(bool)
    print(c)
    print(d)
    

    再看看结果
    运行结果
    这下明白了吗?0代表False 非0代表True!
    那么.astype(int)是啥意思呢?
    那不就是转化为整型数据吗!True和False转化为整型数据是什么样子呢?
    不就是0和1嘛!
    代码如下:

    import numpy as np
    a=[[1,2,1],[2,3,5]]
    b=[[0,0,0],[2,3,5]]
    c=np.array(a).astype(bool).astype(int)
    d=np.array(b).astype(bool).astype(int)
    print(c)
    print(d)
    

    运行结果
    看一下,是这样的吧!
    那么astype(float)呢?是什么意思?不用我说你也知道了吧,那不明白看下面代码!

    import numpy as np
    a=[[1,2,1],[2,3,5]]
    b=[[0,0,0],[2,3,5]]
    c=np.array(a).astype(bool).astype(int).astype(float)
    d=np.array(b).astype(bool).astype(int).astype(float)
    print(c)
    print(d)
    

    运行结果
    希望可以帮助你

    展开全文
  • 转载自...Type-C接口 母头/母座 公头/插头   可以很明显看出,插口内的Pin功能相对于中心对称。公头插入母头,无论正反插,引脚功能都完美契合。而且电源VBUS/GND都拥有4个Pin,最大支持5A电流

    大部分内容来自《https://blog.csdn.net/Mark_md/article/details/114578359?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242》

    Type-C接口

    母头/母座

    在这里插入图片描述

    公头/插头

    在这里插入图片描述
      可以很明显看出,插口内的Pin功能相对于中心对称。公头插入母头,无论正反插,引脚功能都完美契合。而且电源VBUS/GND都拥有4个Pin,最大支持5A电流,在保证高速数据传输的同时也提高了电流承载能力。

    引脚功能定义

    Pin名称功能描述Pin名称功能描述
    A1GND接地B12GND接地
    A2SSTXp1SuperSpeed差分信号#1,TX,正B11SSRXp1SuperSpeed差分信号#1,RX,正
    A3SSTXn1SuperSpeed差分信号#1,TX,负B10SSRXn1SuperSpeed差分信号#1,RX,负
    A4VBUS总线电源B9VBUS总线电源
    A5CC1Configuration channelB8SBU2Sideband use (SBU)
    A6Dp1USB 2.0差分信号,position 1,正B7Dn2USB 2.0差分信号,position 2,负
    A7Dn1USB 2.0差分信号,position 1,负B6Dp2USB 2.0差分信号,position 2,正
    A8SBU1Sideband use (SBU)B5CC2Configuration channel
    A9VBUS总线电源B4VBUS总线电源
    A10SSRXn2SuperSpeed差分信号#2,RX,负B3SSTXn2SuperSpeed差分信号#2,TX,负
    A11SSRXp2SuperSpeed差分信号#2,RX,正B2SSTXp2SuperSpeed差分信号#2,TX,正
    A12GND接地B1GND接地

    引脚功能分布

    在这里插入图片描述

    CC1、CC2的作用:设备识别、PD快充

      这里不得不提一下CC1、CC2引脚的作用,大家最早认识快充应该是从高通CPU的QC开始的。通过提高输电电压,来提高输送功率。但QC协议中,通信使用的是USB的DP、DM,这就导致充电的时候会对USB通信造成影响。
      而USB-PD对电源设备的识别依靠CC1、CC2引脚,避免了QC标准与DP、DM的冲突。使得USB-PD在传输电力的同时,数据传输不会受到影响。

    辅助信号 sub1 和 sub2(sideband use)

    在特定的一些传输模式时才用。平时可以不管,直接忽略。

    24Pin、16Pin、12Pin、6Pin

    24Pin

    全功能type-c。
    在这里插入图片描述
    在这里插入图片描述
    接插件成本高,在一些不需要全功能的场合显得不合适。

    16Pin、12Pin

      普通的MCU都没有USB3.0,只有USB2.0,使用24Pin的TypeC很浪费,于是就有了16Pin的TypeC。
    在这里插入图片描述
      16Pin TypeC在24Pin的基础上阉割了USB3.0的TX1/2、RX1/2,保留了SBU1/2、CC1/2、USB2.0的D+D-,除了没有USB3.0/3.1高速传输外,其他别无二致,同样支持 PD快充、音频设备、HDMI传输、调试模式等功能。
      我们所说的16Pin TypeC和12Pin TypeC其实是同一种接口。16Pin一般为接口厂家、封装的正式名称,而日常生活中习惯称呼为12Pin。这是因为接口设计时,将TypeC母座两端的两个Vbus和GND出线都并拢了起来,虽然从口那里看是16条出线,但座子后面的焊盘只有12个。
    在这里插入图片描述
    在这里插入图片描述

    6Pin

      对于玩具、牙刷等生活用品,产品定位上没有USB通信的需求,只需要USB取电充电。那么连USB2.0都可以省掉了。6Pin TypeC正式出道。
       6Pin TypeC仅仅保留Vbus、GND、CC1、CC2。接口两侧对称分布着两组GND、Vbus,使得防反插功能保留,粗线也让其更为方便的传输大电流。
      CC1、CC2用于PD设备识别,承载USB-PD的通信,以向供电端请求电源供给。在传输电力的同时,USB数据传输不会受到影响。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • USB Type C规范详解

    万次阅读 多人点赞 2019-08-23 22:19:31
    USB Type C规范详解 目前USB Type C接口应用非常广泛,可以传输DP,USB,PCIE,音频等信号,已经不是纯粹的用来传输USB信号了,即USB Type C摆脱了和USB的从属关系,自己当家作主了。下面来介绍下USB Type C里面比较...

    USB Type C规范详解
    目前USB Type C接口应用非常广泛,可以传输DP,USB,PCIE,音频等信号,已经不是纯粹的用来传输USB信号了,即USB Type C摆脱了和USB的从属关系,自己当家作主了。下面来介绍下USB Type C里面比较重要的点。

     

    协议来源
    USB官方网站上可以下载到最新的协议《USB Type-C Specification Release 1.4.pdf》,最新的为2019年4月3日。文末也会共享出来。
    该协议主要内容是:定义USB Type C的插头,插座,和线缆
    USB Type-C的Vbus的电流的检测与使用
    使用USB Type-C的源(主机或下游集线器端口)可以在vbus上实现更高的源电流,以便能够更快地充电需要比USB3.2规范中指定的更多电流的移动设备或供电设备。所有USB主机和集线器端口都通过CC引脚来设置当前可用的电流水平。
    USB PD各个模式供电能力如下表:

     

    USB Type-C接口
     
    Type-c接口有公头和母座,如下图:
     
     
     

    Power有关的信号     
    VBUS,USB线缆的bus power(和我们通常意义上VBUS保持一致),电源和GND都有4根线,这就是为什么能支持到100W的原因。      
     VCONN(只有在插头上才会有该信号),当线缆里有芯片的时候,用来给线缆里的芯片供电(3.3V或5V)。      
    USB 2.0数据线,D+/D-。它们在插头端只有一对,和旧的USB 2.0规范一致。但为了支持正反随意插。在插座端定义了两组,这样插座端可以根据实际情况进行合适的mapping。 
    USB3.1/USB3.2数据线,TX+/-和RX+/-,用于高速的数据传输。插头和插座端都有两组,用于支持正反随意插。 
    Configuration的信号,对插头来说,只有一个CC,另外一个伪VCONN,对插座来说,有两个CC1和CC2。
    SUB信号,用于USB拓展功能,可用于模拟音频。

     

    USB Type-C电缆
    如下表,USB2.0规范的电缆长度小于4米,USB3.2 Gen1的长度小于2米,USB3.2Gen2的电缆长度小于1米。
     
    全功能USB Type-C电缆信号说明
     
     
    上图是标准的USB Type-C的电缆,高速信号差分对SDP都采用同轴线,信号地回流是通过屏蔽GND。

    USB2.0/USB3.1/USB3.2线缆说明
    如下图,如果type-c线缆仅仅用作USB功能,那么其实有很多信号线是不需要的,只需要以下信号即可(USB3.2 Gen2x2除外)。USB2.0需要更少的线,其5-10信号是不需要的。
     
    线缆的粗细线号
    规范不指定金属丝规。更粗的线造成较少的损失,但代价是电缆直径和灵活性。多根电线可用于一条单线,如Vbus或地。建议使用最小的线号,以满足电缆组装、电气和机械的要求。为了最大限度地提高电缆的灵活性,电缆的外径应该尽可能的减小。一个典型的USB全功能型Type-C型电缆外径可从4mm至6mm,而一个典型的USB2.0型Type-C电缆外径可从2mm至4mm。一个典型的USB Type-C的USB3.1电缆外径可以从3mm到5mm。
    线号参考如下表:
     
    阻抗控制
    SDP屏蔽差分线的阻抗控制在90Ω±5Ω,单端同轴线控制在45Ω±3Ω。阻抗应该用200 ps(10%-90%)的上升时间来评估。
    电源VBUS和GND
    如下图,电源的压降要小于500mV,Gnd上面的压降要小于250mV

    配置通道(CC)详解
    配置通道CC的用途如下:
    检测USB设备是否接入;
    检测USB插入方向,并以此建立USB 数据通道的路由;
    插入后帮助建立USB设备角色(谁为HOST,谁为Device);
    发现并配置VUBS,配置USB PD供电模式;
    配置Vconn;
    发现和配置可选的备用和辅助模式;
    名词解释
    在USB2.0端口,USB根据数据传输的方向定义了HOST/Device/OTG三种角色,其中OTG即可作为HOST,也可作为Device,在Type-C中,也有类似的定义。
    DFP(Downstream Facing Port):下行端口,可以理解为Host或者是HUB,DFP提供VBUS、VCONN,可以接收数据。在协议规范中DFP特指数据的下行传输,笼统意义上指的是数据下行和对外提供电源的设备。
    UFP(Upstream Facing Port):上行端口,可以理解为Device,UFP从VBUS中取电,并可提供数据。典型设备是U盘,移动硬盘。
    DRP(Dual Role Port):双角色端口,类似于以前的OTG,DRP既可以做DFP(Host),也可以做UFP(Device),也可以在DFP与UFP间动态切换。典型的DRP设备是笔记本电脑。设备刚连接时作为哪一种角色,由端口的Power Role(参考后面的介绍)决定;后续也可以通过switch过程更改(如果支持USB PD协议的话)。
    USB PORT的供电(或者受电)情况,USB Type-C将port划分为Source、Sink。
    Source:通过VBUS或者VCONN供电。
    Sink:通过VBUS或者VCONN接受供电。
    DRP(Dual-Role-Power):既可以作为Source,也可以作为Sink。到底作为Source还是Sink,由设备连接后的配置决定。
    Source和Sink的连接过程
    Source和Sink的通用USB情况下,配置接口的典型流程如下:
    首先,检测端口之间的有效连接(包括确定电缆方向、源/接收器和DFP/UFP关系)。
    其次检测电缆的能力。
    再次接通USB供电(协商USB电力传输,选择供电模式,电池充电等)。
    最后进行USB枚举。
    Source to Sink的连接检测
    如下图,Source端是上拉电阻,Rp,Sink端接下拉电阻Rd

    在未对接时,Source检测到CC管脚都为高电平,Sink端检测到CC管脚都未低电平。对接后,形成分压,电平为中间值。Rp的阻值能表明Source能够提供的功率水平。
    源端CC1,CC2模型
     
    如上图
    Source端使用一个MOS管去控制Vbus,初始状态下,FET为关闭状态,Vbus不通。
    Source端CC1/CC2均上拉至高电平,同时检测是否有Sink插入,当不论哪一个管脚检测到有Rd下拉电阻时,说明Sink被检测到。Rp的阻值表明Host能够提供的功率水平。
    Source端根据Cable中哪一个CC引脚为Rd下拉,去建立正确的USB高速数据路由,同时决定另外一个CC引脚提供VCONN
    当检查到Sink接入后,Source使能Vbus和Vconn。
    Source可以动态调整Rp的值,告知Sink端的电流提供能力发生变化,告知SINK最大可以使用的电流
     Source会持续检测Rd,检测到拔出事件后会断开连接,Vbus和Vconn都会断开。
    如果Source支持高级功能(PD或者Alternate Mode),会通过USB PD协议进行沟通实现。
    Sink端CC1,CC2模型
     
    如上图
    SINK的两个CC引脚均通道Rd下拉到GND。
    SINK通过检测电源VBUS是否存在,来判断Source的连接与否。
    SINK通过CC引脚上拉的特性,来检测目前的USB高速数据链路。
    SINK可选地去检测Rp的值,去判断Source可提供的电流。同时管理自身的功耗,保证不超过Source提供的最大范围。
    同样的,如果支持高级功能,通过CC引脚进行USB PD协议进行沟通实现。
    DRP的CC1,CC2模型
     
    DRP模式(双向供电)如上图:
    DRP使用MOS管来启用/禁用Vbus的电源传递,并且在开始时禁用Vbus。
    DRP使用开关来决定自身是Source端还是Sink端。
    DRP在Source和Sink之间的切换:在建立特定的稳定状态之前,DRP在将自己在Source和Sink之间交替进行,根据协议最终会确认是Source还是Sink。当DRP最终确定为Source端时,它遵循Source端操作协议来检测Sink端是否接入。如果检测到Sink端,则提供Vbus、Vconn,并继续作为Source运行。反之,当DRP最终确定为Sink端时,它监视Vbus以检测它是否连接到一个Source,如果检测到连接到Source,它将继续作为Sink运行。
    Source to  Sink工作过程
     
    工作过程如上图:
    刚开始Source和Sink均处于未连接状态;
    Source和Sink物理连接后,Source探测到CC的下拉电阻Rd信号,打开电源Vbus和Vconn;
    然后Sink端会探测到Vbus,进入到连接状态。
    当Source和Sink处于持续状态,Source会根据需要改变Rp来设置最大电流输出能力。Sink会检测Rd上面的电压来获取能从Vbus上获得的最大电流值。Source会监测CC管脚来判定Sink是否被移出。Sink会监测Vbus是否存在来判定是否和Source断开。
    电流能力与Rd上电压vRd的关系如下表:
     
    USB供电能力有三种,USB2.0,USB3.2单通道,USB3.2双通道
     
    除了Source to sink,当Source连接到DRP,DRP端会自适应为Sink端。
    当Sink连接到DRP,DRP端会自适应为Source端。
    Source连接到Source,Sink连接到Sink,都是不会成功的。
    USB Power Delivery
    USB Power Delivery电力传输是Type-C接口的特征之一。当需要USB PD电力传输时,使用Bi-phase Mark Coded(BMC)编码协议,通过CC管脚进行通信。
    CC的通信图如下:
     
    CC上面的BMC信号如下图:

    供电和充电
    任何USB Type-c端口提供超过默认电流和/或支持USBPower Delivery传送应满足要求,就像它是一个充电器。
    电源(如电池充电器、集线器、下游端口和主机)均可用于电池充电。充电器使用USB Type-C接口或USB Type-C电缆实现时,应遵循以下要求:
    电源应使用USB Type-C current方法公开其功率能力,并可额外支持其他USB标准(USB BC 1.2或USB PD)
    如果电源能够提供大于默认的VBUS的电压,则应完全符合USB PD规范,并应仅使用USB PD协商其电源供电。
    如果电源能够提供大于3.0A的电流,则应使用US PD规范来确定电缆的载流能力。
    Type  C接口的充电器,只有当它检测到一个接收器被连接时,才能将电源VBUS接通,并且当它检测到Sink端被分离时,应该从VBUS上移除电源。


    电子标记的线缆
    所有USB全功能Type-C型电缆应电子标记。 eMarker是电子标记电缆中的元素,该电缆响应USB PD发出的标识命令返回有关电缆的信息(如电缆的电流承载能力、性能、厂商标识,支持的sstx/ssrx通道数等)。
    电子标记的电缆本身用电一般来自于Vconn,Vbus也有可能被用到。
     
    一种典型的电子标记电缆如上图。隔离元件(Iso)应防止Vconn通过电缆的端到端Ra电阻的作用是高速Source端,本电缆需要用到Vconn。


    VPAs和VPDs
    VPAs:VCONN-Powered Accessories--Vconn驱动的附件
    VPDs:VCONN-Powered USB Devices--Vconn驱动的USB设备
    VPAs和VPDs都是直接连接的sink,只需Vconn即可操作。两者都在Vconn上接有电阻Ra,在CC上接有电阻Rd。通过判断Vconn是否被移除,并以此来判断设备是否断开连接(在Vbus没有的时候)。
    如果VCONN供电配件希望提供充电功能,则必须通过在主机和充电端口上独立协商电压和电流来实现,并且可能在将Source端电压传输到Sink之前重新调节电压。 Sink能够获取VPAs通告给它的可承载电流。

     

    电阻值设置
    各电流值对应的Rp的值如下表:
     
    Rp都是5.1K电阻下地,电源供电能力的检测与否与电阻精度相关
     
    Ra的值的大小范围为:800Ω-1.2K
     

    相关电压范围
    在Sink与Source连接后,因为Rp与Rd分压的原因,Sink端的CC的电压范围如下表:
     

    功能扩展
    USB Type-C的牛逼之处就在于其功能扩展,即它不仅仅在只是用来传输USB信号了,可以拓展用于其它功能。
    USB Type-C协议里面,拓展功能称之为Alternate Mode,如何进入Alternate Mode呢。有很多种功能,比如4 lane DP,DP 2lane+USB3.0,自然得在一开始就通过协议来沟通告知进入哪一种模式。
    那么是如何沟通的呢?还是通过CC管脚,通过PD协议来完成。

    模拟音频模式
    3.5mm音频接口可以转Type-C端口,USB2.0数据通道传输模拟音频信号,音频右声道接DP,音频左通道接DN,MIC信号则连接在SBU引脚上,在这个模式当中,电源可以提供到500mA电流。
    如何工作在音频模式呢?
    通过将CC引脚和VCON短接接,并且下拉电阻小于Ra/2(根据上文,Ra最小为800Ω,则小于400ohm),或者分别对地,下拉电阻小于Ra(小于800ohm),则Host会识别为音频模式。
     
     

    扫描下方二维码,回复“USB”,可获得官方协议原文件。
    获得硬件资料,欢迎关注微信公众号:硬件工程师炼成之路。

     

    展开全文
  • Type类型详解

    万次阅读 2018-01-09 18:59:19
    什么是Type? 引用网上的话来说就是: Type是一个空接口,所有类型的公共接口(父接口),其意义表示Java所有类型,这里所谓的类型是从Java整个语言角度来看的,比如原始类型、参数化类型(泛型)、类型变量及其数组...

    什么是Type?

    引用网上的话来说就是:
    Type是一个空接口,所有类型的公共接口(父接口),其意义表示Java所有类型,这里所谓的类型是从Java整个语言角度来看的,比如原始类型、参数化类型(泛型)、类型变量及其数组等,可以理解为,Class(类)是Java对现实对象的抽象,而Type是对Java语言对象的抽象。

    Type的类型

    实现了Type接口的子接口为GenericArrayType(泛型数组类型),ParmeterizedType(参数化类型),TypeVariable<D>(类型变量),WildcardType(通配符类型)。实现了Type接口的子类有Class(类)。所有Type一共可以表示这5类数据。主要介绍的就是四个子接口。

    Type的用处

     由于java1.5引入了泛型这一概念,大大方便了我们代码的编写和优化,但是考虑到泛型擦除这一问题,当我们的代码在运行时期会擦除所有的泛型,这一我们在运行时期想要获取某一类原来是带有泛型的,而后来被擦除了的数据的泛型类型时就会有问题。所以java引入了Type这一概念。Type也主要是为在运行时期获取泛型而服务。

    接下来,我们开始介绍泛型中各子接口和子类的作用,在开始介绍之前我们了解一下编码过程中主要的运用到泛型的情况。
    1.List<T>
    2.Set<T> 
    3.Map<K,V>
    4.class<?>(自定义类或接口的泛型)

    ParmeterizedType(参数化类型)的作用

        parameterizedType主要是用来表示 如 Collection<String>或者Class<T>。 parameterizedType表示的类型非常的简单,只要带着泛型,除了不可以是数组和本类上定义的泛型以外,其他都被列入ParameterizedType的范围。

    ParameterizedType的主要方法:

    Type[] getActualTypeArguments()
             返回表示此类型实际类型参数的 Type 对象的数组。
    
     Type getOwnerType()
    
             返回 Type 对象,表示此类型是其成员之一的类型。
    
     Type getRawType()
    
              返回 Type 对象,表示声明此类型的类或接口。
    接下来我们来看一个例子。
    示例一:
    现在有三个类,分别为Person,TypeBean以及ParameterizedTypeTest
    Person类
    public class Person {
    	@Override
    	public String toString() {
    		return "Person []";
    	}
    	 class Animal <T> {
    		public String name;
    	}
    }

    TypeBean类
    public class TypeBean<T> {
    	public  List<String> list;
    	private  Set<String>[] set;
    	private  List noGerList;
    	Map.Entry<String,Integer> entry;
    	Person.Animal<String> animal;
    	String str = new String();
    	T t;
    }


    ParameterizedTypeTest类
    public class ParameterizedTypeTest{
    	public static void main(String[] args) throws Exception {
    		Class<TypeBean> bean = (Class<TypeBean>) Class.forName("TypeBean");
    		Field[] declaredFields = bean.getDeclaredFields();
    		int i =1;
    		for (Field field : declaredFields) {
    			field.setAccessible(true);
    			System.out.println("--------------"+i);
    			System.out.println("field name is : "+field.getName());
    			 System.out.print("field.getGenericType() instanceof ParameterizedType");
    			 System.out.println("--------"+(field.getGenericType() instanceof ParameterizedType));
    			 if(field.getName().equals("animal")){
    				 ParameterizedType type = (ParameterizedType) field.getGenericType();
    				 Type ownerType = type.getOwnerType();
    				 System.out.println("Person.Animal<String>的ownerType是。。。"+ownerType);
    				 Type rawType = type.getRawType();
    				 System.out.println("Person.Animal<String>的rawType是"+rawType);
    				 Type[] actualTypeArguments = type.getActualTypeArguments();
    				 for (Type type2 : actualTypeArguments) {
    					System.out.println(type2.getTypeName()+"获取到的actualTypeArguments分别为:"+type2.getTypeName());
    				}
    				 System.out.println("Person.Animal<String> instanceof ParameterizedType -----"+(type instanceof ParameterizedType));
    			 }
    			 System.out.println("--------------"+i);
    			i++;
    			
    		}
    	}
    }


    运行 ParameterizedTypeTest类得到的结果如下。
    --------------1
    field name is : list
    field.getGenericType() instanceof ParameterizedType--------true
    --------------1
    --------------2
    field name is : set
    field.getGenericType() instanceof ParameterizedType--------false
    --------------2
    --------------3
    field name is : noGerList
    field.getGenericType() instanceof ParameterizedType--------false
    --------------3
    --------------4
    field name is : entry
    field.getGenericType() instanceof ParameterizedType--------true
    --------------4
    --------------5
    field name is : animal
    field.getGenericType() instanceof ParameterizedType--------true
    Person.Animal<String>的ownerType是。。。class Person
    Person.Animal<String>的rawType是class Person$Animal
    java.lang.String获取到的actualTypeArguments分别为:java.lang.String
    Person.Animal<String> instanceof ParameterizedType -----true
    --------------5
    --------------6
    field name is : str
    field.getGenericType() instanceof ParameterizedType--------false
    --------------6
    --------------7
    field name is : t
    field.getGenericType() instanceof ParameterizedType--------false
    --------------7
    
    第一个字段List<String> list 是ParameterizedType。
    第二个字段Set<String>[] set由于是数组,所以不是ParameterizedType。
    第三个字段List noGerList由于没有带泛型,所以也不是ParameterizedType。
    第四个字段Map.Entry<String,Integer> entry 是parameterizedType。
    第五个字段Person.Animal<String> animal 是parameterizedType。此处我们进一步使用了ParameterizedType的3个方法演示给大家看。我们可以看到ownerType是animal的外部类Person。这也印证了获取到的类型(Person)为原类型(Person.Animal)是其(Person)成员之一。(这里还有其他情况欢迎在评论区告诉。
    而rawType则是其自身类型。
    getActualTypeArguments()获取到的Type数组则是泛型中的所有类型。(例如Map<k,v>则获取到的数组中包含k,v这两个类型。并且k在前,v在后。)
    第六个字段String str = new String();由于没有带泛型所有不是parameterizedType。
    第七个字段T t 由于是本类上定义的泛型,所以也不行。

    TypeVariable<D>(类型变量)的作用

    TypeVariable 是各种类型变量的公共高级接口。类型变量在反射方法首次需要时创建(在此包中指定)。如果类型变量 t 由类型(即类、接口或注释类型)T 引用,而且 T 由 T 的第 n 个封闭类声明(请参见 JLS 8.1.2),那么创建 t 需要解析(请参见 JVMS 5)T 的第 i 个封闭类,其中 i = 0 到 n(包含)。创建某个类型变量决不能导致创建其边界。重复创建类型变量没有效果。

    可以在运行时将多个对象实例化,以表示一个给定的类型变量。尽管类型变量仅创建一次,这并不意味着任何缓存实例的要求都表示类型变量。不过,表示类型变量的所有实例彼此必须相等 (equal())。因此,使用类型变量的用户决不能依靠实现此接口的类实例的身份。


    这是api中的介绍,其实非常简单。这就是我们非常常用的声明类时的泛型。

    例如: 
    public class Test<T>{

    }
    这里的T的类型就属于TypeVariable。(注:T不能为数组。)

    TypeVariable的主要方法

    Type[] getBounds() 
              返回表示此类型变量上边界的 Type 对象的数组。如上边界未显式声明,则为Object。
     D getGenericDeclaration() 
              返回 GenericDeclaration 对象,该对象表示声明此类型变量的一般声明。 
     String getName() 
              返回此类型变量的名称,它出现在源代码中。
     示例二:
    
    现在有3个类 Person,TypeVariableBean,TypeVariableTest
    TypeVariableBean类
    public class TypeVariableBean<T> {
    	public  List<String> list;
    	Class<?> clz;
    	private  Set<String>[] set;
    	private  List noGerList;
    	Map.Entry<String,Integer> entry;
    	Person.Animal<String> animal;
    	String str = new String();
    	T t;
    }
    Person类
    public class Person {	
    	@Override
    	public String toString() {
    		return "Person []";
    	}
    	 class Animal <T> {
    		public String name;
    	}
    }
    TypeVariableTest类
    public class TypeVariableTest {
    	public static void main(String[] args) {
    		Field[] declaredFields = TypeVariableBean.class.getDeclaredFields();
    		for (Field field : declaredFields) {
    			field.setAccessible(true);
    			Type type = field.getGenericType();
    			System.out.println("field.getGenericType() instanceof TypeVariable ? ------ "+(type instanceof TypeVariable));
    			if(field.getGenericType() instanceof TypeVariable){
    				Type[] bounds = ((TypeVariable) type).getBounds();
    				int i = 0;
    				for (Type type2 : bounds) {
    					System.out.println("------------"+i);
    					System.out.println("上边界是:"+type2.getTypeName());
    					System.out.println("------------"+i);
    					i++;
    				}
    				GenericDeclaration genericDeclaration = ((TypeVariable) type).getGenericDeclaration();
    				System.out.println("TypeeVariable's Name::::"+((TypeVariable) type).getName());
    				System.out.println(genericDeclaration);
    			}
    		}
    	}
    }


    此时我们运行TypeVariableTest类时。得到的结果是:
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ true
    ------------0
    上边界是:java.lang.Object
    ------------0
    TypeeVariable's Name::::T
    class TypeVariableBean
    我们可以看出,只有最后一个是我们自己在类上定义的泛型时才是TypeVariable。此时的上边界是Object,因为我们没有显式的定义其上边界,现在我们改变一下TypeVariableBean这个类的泛型上边界。
    更改后的TypeVariableBean类
    public class TypeVariableBean<T extends Person & Serializable> {
    	public  List<String> list;
    	Class<?> clz;
    	private  Set<String>[] set;
    	private  List noGerList;
    	Map.Entry<String,Integer> entry;
    	Person.Animal<String> animal;
    	String str = new String();
    	T t;
    }
    这时我们运行的结果如下
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ false
    field.getGenericType() instanceof TypeVariable ? ------ true
    ------------0
    上边界是:Person
    ------------0
    ------------1
    上边界是:java.io.Serializable
    ------------1
    TypeeVariable's Name::::T
    class TypeVariableBean
    这时就出现了两个上边界。

    GenericArrayType(泛型数组类型)的作用

    顾名思义,只有是带泛型的,并且是数组的那就属于GenericArrayType的范畴。

    GenericArrayType的主要方法:

    Type	getGenericComponentType() 
              返回表示此数组的组件类型的 Type 对象。
    示例三:
    有四个类 Person ,PersonInterface,GenericArrayTypeBean,GenericArrayTypeTest
    Person类
    public class Person {	
    	@Override
    	public String toString() {
    		return "Person []";
    	}
    	 class Animal <T> {
    		public String name;
    	}
    }


    PersonInterface类
    public interface PersonInterface {
    }
    GenericArrayTypeBean类
    public class GenericArrayTypeTest {
    	public static void main(String[] args) {
    		Field[] fields = GenericArrayTypeBean.class.getDeclaredFields();
    		int i =1;
    		for (Field field : fields) {
    			Type type = field.getGenericType();	
    			System.out.println("----------"+i);
    				if(type instanceof ParameterizedType){
    					System.out.println(type.getTypeName());
    					System.out.println("field.getGenericType() instanceof ParameterizedType::");
    				}else if(type instanceof TypeVariable){
    					System.out.println(type.getTypeName());
    					System.out.println("field.getGenericType() instanceof TypeVariable::");
    				}else if(type instanceof GenericArrayType){
    					System.out.println(type.getTypeName());
    					System.out.println("field.getGenericType() instanceof GenericArrayType::");
    					Type genericComponentType = ((GenericArrayType) type).getGenericComponentType();
    					System.out.println(type.getTypeName()+"数组的组成为:"+genericComponentType.getTypeName());
    				}else if(type instanceof Class){
    					System.out.println(type.getTypeName());
    					System.out.println("field.getGenericType() instanceof Class::");
    				}else{
    					System.out.println(type.getTypeName()+" instanceof "+type.getClass());
    				}
    				System.out.println("----------"+i);
    				i++;	
    		}
    	}
    }
    运行GenericArrayTypeTest类的结果为:
    ----------1
    java.util.List<Person>[]
    field.getGenericType() instanceof GenericArrayType::
    java.util.List<Person>[]数组的组成为:java.util.List<Person>
    ----------1
    ----------2
    java.util.Set<K>
    field.getGenericType() instanceof ParameterizedType::
    ----------2
    ----------3
    java.util.Map<K, V>
    field.getGenericType() instanceof ParameterizedType::
    ----------3
    ----------4
    java.util.List<Person>
    field.getGenericType() instanceof ParameterizedType::
    ----------4
    ----------5
    K
    field.getGenericType() instanceof TypeVariable::
    ----------5
    ----------6
    K[]
    field.getGenericType() instanceof GenericArrayType::
    K[]数组的组成为:K
    ----------6
    ----------7
    Person
    field.getGenericType() instanceof Class::
    ----------7
    ----------8
    java.lang.String
    field.getGenericType() instanceof Class::
    ----------8
    ----------9
    PersonInterface
    field.getGenericType() instanceof Class::
    ----------9
    由此我们可以看出只要是带泛型,并且是数组的就属于GenericArrayType。并且getGenericComponentType方法就是获得该数组的组成类型。

    WildcardType(通配符类型)的作用

    表示通配符类型参数。

    WildcardType是依托于ParameterizedType和GenericArrayTypeTest而存在的。

    示例如下:

    Class<?>
    List<? extends Number>
    Set<? super T>

    WildcardType的主要方法

     Type[] getLowerBounds() 
              返回表示此类型变量下边界的 Type 对象的数组。 
     Type[] getUpperBounds() 
              返回表示此类型变量上边界的 Type 对象的数组。 
    


    这个类型比较好理解,直接上例子
    示例四:WildcardTypeBean,WildcardTypeTest
    WildcardTypeBean类
    public class WildcardTypeBean<K extends Number & Serializable,V> {
    	List<? extends Person>[] list;
    	Set<? super Man> set; 
    	K k;
    }
    WildcardTypeTest类
    public class WildcardTypeTest {
    	public static void main(String[] args) throws Exception{
    		Field[] fields = WildcardTypeBean.class.getDeclaredFields();
    		for (int i = 0; i <fields.length; i++) {
    			System.out.println("--------------"+(i+1));
    			Field field = fields[i];
    			System.out.println("file:"+field);
    			Type type = field.getGenericType();
    			if(type instanceof GenericArrayType){
    				GenericArrayType gat = (GenericArrayType)type;
    				ParameterizedType genericComponentType = (ParameterizedType)gat.getGenericComponentType();
    				Type[] actualTypeArguments = genericComponentType.getActualTypeArguments();
    				WildcardType t = (WildcardType)actualTypeArguments[0];
    				Type[] upperBounds = t.getUpperBounds();
    				for (Type type2 : upperBounds) {
    					System.out.println("upperBounds:"+type2.getTypeName());
    				}
    				Type[] lowerBounds = t.getLowerBounds();
    				for (Type type2 : lowerBounds) {
    					System.out.println("lowerBounds:"+type2.getTypeName());
    				}
    			}else if(type instanceof ParameterizedType){
    				WildcardType wildcardType = ((WildcardType)((ParameterizedType) type).getActualTypeArguments()[0]);
    				Type[] lowerBounds = wildcardType.getLowerBounds();
    				for (Type type2 : lowerBounds) {
    					System.out.println("lowerBounds:"+type2.getTypeName());
    				}
    			}else{
    				System.out.println(type.getTypeName()+" instanceof "+type.getClass());
    			}
    			System.out.println("--------------"+(i+1));
    		}
    }


    运行结果:
    --------------1
    file:java.util.List[] WildcardTypeBean.list
    upperBounds:Person
    --------------1
    --------------2
    file:java.util.Set WildcardTypeBean.set
    lowerBounds:Man
    --------------2
    --------------3
    file:java.lang.Number WildcardTypeBean.k
    K instanceof class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
    --------------3
    到此,Type的四个子接口就基本介绍完毕了。如果有错误的地方,欢迎各位大牛在评论区指出!!!








































    展开全文
  • ES Mapping、字段类型Field type详解

    万次阅读 多人点赞 2018-10-15 15:02:18
    "_type": "my_type", "_id": "3", "_score": 1, "_source": { "date": 1420070400001 } } ] } } 排序结果: { "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, ...
  • 成功解决AttributeError: 'NoneType' object has no attribute 'find_all' 目录 解决问题 解决思路 解决方法 解决问题 AttributeError: 'NoneType' object has no attribute 'find_all' 解决...
  • python type函数_Python type()函数

    千次阅读 2020-07-14 11:44:52
    python type函数 Python type()函数 (Python type() Function) Python has a lot of buit-in function. The type() function is used to get the type of an object. Python具有很多内置功能。 type()函数用于获取...
  • Java反射——Type接口详解

    万次阅读 多人点赞 2018-09-06 19:59:42
    Type的简介 Type的获得 Type的分类 1,Class 2,ParameterizedType 3,GenericArrayType 4,WildcardType 5,TypeVariable Type的简介 java.lang.reflect.Type接口及其相关接口用于描述java中用到的所有...
  • 想要求两个图片的psnr和ssim值,代码上午还可以正常运行,下午再打开就报错 import numpy ...TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneT 这是错误提示,请问怎么改呢?
  • Mybatis优雅存取json字段的解决方案 - TypeHandler (一)

    万次阅读 多人点赞 2019-11-30 23:37:23
    register(Type javaType, TypeHandler<? extends T> typeHandler) 如果 typeHandler 的Class上有 MappedJdbcTypes 注解 注解里配置了JdbcType, 调用register(javaType, handledJdbcType, typeHandler) 进行...
  • 我们先来看看频域资源的映射,分为type 0和type 1映射,这个分别对应LTE中的type 0和type 2映射。在LTE中,可分配的频域资源由一个载波的带宽决定,而在NR中,可分配的频域资源由当前载波激活的B
  • Type-C接口

    万次阅读 2017-11-17 16:51:57
    TYPE-C接口 USB Type-C接口的命名原语USB Type-C连接器,这是一种坚固的易于使用的接口。支持正反插,方便快捷。支持超高速率通信功能和功率输出。最大传输速率10Gbits/S,最大输出功率100W,最大电流5A。大小8.3mm...
  • 细谈Type-C、PD原理(一)

    万次阅读 多人点赞 2018-12-17 15:10:02
    一、Type-C简介以及历史 二、Type-C Port的Data Role、Power Role 三、Type-C的Data/Power Role识别协商/Alt Mode 四、如何进行数据链路的切换 五、相关参数/名词/状态解释 六、PD协议简介 一、Type-C简介...
  • MyBatis自定义类型处理器 TypeHandler

    万次阅读 多人点赞 2019-05-20 18:52:38
    if (type == null) throw new IllegalArgumentException("Type argument cannot be null"); this.type = type; } @Override public void setNonNullParameter(PreparedStatement ps, int i, BaseEnum ...
  • cannot contain wildcard type '*' at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java : 982 ) ~[spring-webmvc- 5.0 .7 . RELEASE.jar : 5.0 .7 .RELEASE] at org...
  • Python中type的使用和元类的理解

    万次阅读 多人点赞 2018-09-06 14:46:15
    print("type的类型是:%s"%type(type)) #typetype自己的对象 ''' 不调用类,也会执行我 tom实例的类型是: Peron类的类型:<class 'type'> type的类型是:<class 'type'> ''' 2.动态创建类:type的使用  ...
  • MySQL EXPLAIN type类型说明

    万次阅读 多人点赞 2018-02-27 14:16:33
    EXPLAIN执行计划中type字段分为以下几种:ALL INDEX RANGE REF EQ_REF CONST,SYSTEM NULL自上而下,性能从最差到最好 type = ALL,全表扫描,MYSQL扫描全表来找到匹配的行(因为film表中rating不是索引)mysql&...
  • Each mapping type could have its own fields, so the user type might have a full_name field, a user_name field, and an email field, while the tweet type could have a content field, a tweeted_at field ...
  • http请求content-type与响应responseType

    万次阅读 2019-03-27 15:33:46
    http请求 http请求信息由浏览器把地址栏URL信息和... (请求消息行) (请求消息头) (空行) (请求消息数据) content-type是请求消息头中的一个请求参数,标识请求消息数据的格式 http响应 HTTP响应也由四个部分组成,...
  • [ExceptionMessage]:Unable to cast object of type ‘System.DBNull’ to type ‘System.String’.\r\n\t[ExceptionStackTrace]: at MySqlConnector.Core.Row.GetString(Int32 ordinal) in /_/src/MySqlConnector/...
  • 24P USB-TypeC 引脚定义 (wikipedia好是真的好,可惜国内看不到,大多为搬运,技术交流用。原链接:wiki百科TypeC) 母头/母座 公头/插头 引脚功能定义 Pin 名称 功能描述 Pin 名称 功能描述 A1 GND ...
  • javax.lang.model.type源码解析

    万次阅读 2018-08-31 19:20:08
    本文我们介绍一下javax.lang.model.type.类不多,如图: 至于为啥要看这部分的代码,原因很简单,javac 实现了javax.lang.model中的API. 解析 TypeKind 该类是一个媒介,定义了java中各种类型所对应的枚举. ...
  • JAVA反射_TYPE类型

    千次阅读 2017-11-28 17:59:41
    java.lang.reflect接口 Type所有已知子接口: GenericArrayType, ParameterizedType, TypeVariable&lt;D&gt;, WildcardType所有已知实现类: Class public interface TypeType 是 Java 编程语言中所有...
  • 数据格式汇总及type, astype, dtype区别

    万次阅读 多人点赞 2018-01-01 16:28:56
    三、看看数据转换 astype等知识 1、向下取整 2、四舍五入 3、向上取整 4、分别取整数部分和小数部分 - 接下来是重点,astype 转载和疑问声明 我祝各位帅哥,和美女,你们永远十八岁,嗨嘿嘿~~~ uint8:在此输入正文...
  • 当command\_py中有1的时候,if "2" 那两行(38,39行)会报错,当command\_py中含有2的时候时3报错,含有3就不报错,这是咋回事,他说类型NoneType不可迭代,但是我这里没有NoneType啊,"1","2","3"不都是字符串么,...
  • HTML中type类型常用种类

    千次阅读 多人点赞 2019-10-27 17:14:49
    button:定义可点击的按钮... <input type="button" name="" id="" value="按钮"><br> <br> checkbox:定义复选框。 <br> <input type="checkbox" name="" id="">男<br> ...
  • USB Type-C的基本原理

    万次阅读 多人点赞 2020-04-05 09:28:30
    USB Type-C的基本原理
  • 随着小新pro发布,看到带了全功能的type-c接口,一直搞不懂什么type-c还有什么全功能,半功能?和雷电3又有什么区别,雷电3又有什么全速,半速。由于搞不清,所以网上看了很多资料,这里总结一下以备后续查阅 说说...
  • @Target({ElementType.METHOD, ElementType.TYPE})

    千次阅读 2020-12-28 14:42:53
    @Target 说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员... 取值(ElementType)有:  1.CONSTRUCTOR:用于描述构造器  
  • 【IoT】NFC 之 Type A 与 TYpe B 卡区别

    万次阅读 2018-12-22 15:57:28
    2)支持更高的通讯速率,Type A 最大的数据通讯速率为 150Kbit/s - 200Kbit/s ,应用 10%ASK 技术的 Type B 至少可支持 400Kbit/s 的速率;   3)外围电路设计简单,读写机具到卡以及卡到读写机具的编码方式均...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,338,329
精华内容 2,935,331
关键字:

type