学习
实践
活动
专区
工具
TVP
写文章

如何获取参数化类型

关于 熟悉class文件结构以及字节码朋友应该都知道,Java是通过"类型擦除"实现,在编译期由编译器将擦除,擦除后就是对应类型类型。 如类型签名,编译后存储在该类class文件结构属性表Signature属性中;字段类型签名,编译后存储在该字段结构属性表Signature属性中;方法方法签名,编译后存储在该方法结构属性表 那么,我们如何通过反射获取一个参数化类型T实际类型呢? 如何获取T实际类型 以jackson框架TypeReference为例,TypeReference源码如下(为了便于读者理解,我简化了): public abstract class TypeReference 实例getGenericSuperclass方法获取; 3、最后调用TypegetActualTypeArguments方法获取参数实际类型; 也叫参数化类型ParameterizedType

1.4K20

相关时,如何在两个之间创建类似子类型关系呢

Integer(10)); // OK someMethod(new Double(10.1)); // OK 当然也是如此,在执行类型调用时,将Number作为其类型参数传递,如果参数是 那么问题来了,当相关时,如何在两个之间创建类似子类型关系呢?例如如何让Box<Integer> 和Box<Double>变得与Box<Number>有关呢? 为了搞懂这个问题,我们先来了解一下同一类型对象是如何实现子类型吧。 小结:可以通过继承或者实现接口来对其进行子类型化。 搞懂了子类型问题,我们回到“如何在两个之间创建类似子类型关系“问题。 或者接口并不会仅仅因为它们类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建或接口之间关系。

15320
  • 广告
    关闭

    热门业务场景教学

    个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C#类型参数约束)

    因为我们数组中存储元素类型是不确定,所以这里我们用到了,其中where T : strut子句约束参数类型T必须为值类型。当然这个程序我们不使用直接定义Object类型数组也可以。 下面重点说说C#类型参数约束: 在定义时,可以对客户端代码能够在实例化时用于类型参数类型种类施加限制。 如果客户端代码尝试使用某个约束所不允许类型来实例化,则会产生编译时错误。 有关更多信息,请参见使用可以为 null 类型C# 编程指南)。 T:class 类型参数必须是引用类型;这一点也适用于任何、接口、委托或数组类型。 T:new() 类型参数必须具有无参数公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。 T:<名> 类型参数必须是指定或派生自指定。 于是,我想能不能写一个简单,其中里面实现对数值类型加减乘除四则运算,遇到问题是 :where子句后面的约束怎么写,我查看数值Int32等等,它们是Object,如果直接定义一个参数

    1K60

    协变与抗变(二)

    前言   在.NET 4之前,接口是不变。.NET 4通过协变和抗变为接口和委托添加了一个重要扩展。协变和抗变指对参数和返回值类型进行转换。    -派生   在函数输出时,函数输出类型(返回类型)从string转换成object。派生-。   这里就比较接近接口协变和抗变概念了。 理解接口协变和抗变(in、out)   我们下面来看看接口协变及抗变例子:   首先我们看下协变,在C#高级编程(第十一版)中指出,如果类型用out关键字标注,接口就是协变。 在C#高级编程中指出概念:如果类型用in关键字标注,接口就是抗变。这样,接口只能把类型T用作其方法输入。   而接口中类型用来作为参数传递了。我们再看调用时,正常传入object类型参数,,但是我们修改传入参数类型为string类型也是可以

    24620

    1-

    C#由CLR在运行时支持,这使得可以在CLR支持各种语言上无缝集合; C#代码在被编译[第一次编译]为IL代码和元数据时[IL和元数据], 采用特殊占位符来表示类型,并用专有的 C#类型携带有丰富元数据,因此C#类型可以应用于强大反射技术;采用[, 接口, 构造器, 值类型/引用类型]约束方式来实现对类型参数"显式约束", 提高了类型安全性。 类型方法 可以用于类型、接口,结构、委托。 C#支持方法,但不支持除方法外其他成员[属性、事件、索引器、构造器、析构器。 约束支持四种形式约束【接口约束,约束,构造器约束,值类型/引用类型约束】; 约束并不是必须,如果没有指定约束,那么类型参数将只能访问System.Object类型公有方法。 约束:表是类型参数必须是继承子指定类型<where T : >; 构造器约束:只支持无参构造器约束,就是必须保障参数类型可以调用它无参构造器<where T : new()>: 值类型/引用类型约束

    401100

    .NET基础面试题整理

    所以结构处理作为类型对待小对象,而处理某个商业逻辑因为结构是值类型所以结构之间赋值可以创建新结构,而是引用类型之间赋值只是复制引用 注:1.虽然结构与类型不一样,可是他们类型都是对象 执行时行为:也是对象,类型参数”变成了元数据;CLR会在需要时候构造利用它们。一个类经过编译好之后和普通并没有什么区别。编译结果只有元数据和CIL。 基于值类型实例化:CLR会讲指定类型参数放到CIL中合适位置,从而创建一个具体化类型。 所以CLR会为没个新参数值创建具体类型 基于引用类型实例化:CLR会创建一个具体化类型。 举例说明平时编程中您定义类型

    34521

    程序设计详解(一)

    前言   C#和.Net一个重要概念,不仅是C#编程语言中一部分,而且与程序集中IL(Intermediate Language)代码紧密集成。    优点   下面介绍下优点,尤其是下面几个: l 性能 l 类型安全 l 二进制代码重用   一、性能     一个主要优点就是性能,在集合和非集合中,对值类型使用非集合 这也就是主要优点了。   二、类型安全     另一个优点就是类型安全,这里我们还是使用非集合ArrayList()和集合List<T>来做案例。      类型还可以在一种语言定义,然后再其他任何.Net语言中使用。 功能   这里我们可以来了解下创建了之后,有哪些功能呢? l 默认值 l 约束 l 继承 l 静态成员   一、默认值     在我们定义了类型之后如何赋值呢?

    17650

    .NET高级特性-Emit(2)定义

    废话不多说,首先,我们先来回顾一下C#内部由什么东西组成:   (1) 字段-C#中保存数据地方,由访问修饰符、类型和名称组成;   (2) 属性-C#中特有的东西,由访问修饰符、类型、名称和 ,由访问修饰符、方法名、参数、入参、出参构成;   (4) 构造器-C#中一种特殊方法,该方法是专门用来创建对象方法,由访问修饰符、与名相同方法名、入参构成。      (3) 实现-C#可以实现多个接口,并实现接口中所有方法   (4) -C#可以包含参数,此外,还可以对实现约束   以上就是C#所具备一些元素,以下为样例: public 这里代码量会比较大,请读者慢慢阅读,也可以参照以上我写生成il代码进行比对。    (GenericParameterAttributes.NotNullableValueTypeConstraint);   (5) 继承和实现接口,注意当实现参数需传递给接口时,需要将接口添加参数后再调用

    30520

    金三银四面试:C#.NET面试题中高级篇3

    IList 接口与List区别是什么? 2.主要约束和次要约束是什么? 3. 如何把一个array复制到arraylist里? 4.数组和 list 和 arraylist 区别? 5. C#异常返回哪些信息? 10. 如何创建一个自定义异常? IList 接口与List区别是什么? IList 接口是 Icollection 接口子代,并且是所有非列表接口。 IList 是个接口,定义了一些操作方法这些方法要你自己去实现,当你只想使用接口方法时,这种方式比较好.他不获取实现这个接口其他方法和字段,有效节省空间. 2.主要约束和次要约束是什么? 当一个参数没有任何约束时,它可以进行操作和运算是非常有限,因为不能对实参进行任何类型保证,这时候就需要用到约束。 约束分为:主要约束和次要约束,它们都使实参必须满足一定规范,C#编译器在编译过程中可以根据约束来检查所有类型实参并确保其满足约束条件。

    34040

    (持续整理中)Visual Studio 中 C# 代码分析规则集中每一项含义 (stylecop ruleset)

    ---- 正在整理中…… 代码分析(Microsoft.Analyzers.ManagedCodeAnalysis) 设计问题 编号 名称 含义 CA1004 方法应提供类型参数 如果方法参数列表中没有用到声明所有 ,那么就会出现此提示(这是因为此时不能被隐式推断,库使用者学习成本会提高,详见:CA1004) CA1005 避免类型参数过多 如果写时候有超过 2 个类型,就会出现此提示 CA1006 不要将类型嵌套在成员签名中 如果出现类似 Func<Task<T> 这样嵌套出现在方法参数签名中,则会出现此提示 CA1018 用 AttributeUsageAttribute 标记特性 如果继承自一个已有的 Attribute,即便已经写了 AttributeUsage,此类型也应该再写一遍,以提高代码可读性和便于文档制作 CA1019 定义特性参数访问器 自定义 Attribute 中显式实现了一个接口方法,导致子类中无法调用此接口方法 CA1040 避免使用空接口 意思就是“避免使用空接口”,这种接口就像是一个标记一样并没有什么作用,考虑使用自定义 Attribute 来实现

    82320

    一文搞定知识

    二、概述 类型C# 2.0 引入,它引入在一定程度上减轻了开发人员压力,同时也使得程序变得更加健壮和稳定。语法也很简单,用尖括号声明类型参数和提供类型实参即可。 在部分文章或图书中会将类型参数数量称为 元数 。 5.嵌套类型 嵌套类型在开发中用比较少,但是还是有必要在这里说一下,因为有部分开发人员对于这一块不甚了解。 方法 前面我们所说都是,在 C# 中除了有还有方法,方法语法和语法类似,并且方法不仅可以出现在种也可以出现在普通中。 由于派生类型参数时类型实参,所以类型参数必须具有等同于或者强于约束条件。 Tip 2:方法同样也可以使用约束,约束条件和类似。 由于派生类型参数时类型实参,所以类型参数必须具有等同于或者强于约束条件。 Tip 2:方法同样也可以使用约束,约束条件和类似。

    22010

    C#

    C# 2008-12-17 作者: 张子阳 分类: C# 语言 .Net 1.1版本最受诟病一个缺陷就是没有提供对支持。 不行,因为我们要记得:是一个模板,它对于在执行时传递类型参数是一无所知,也不会做任何猜测,我们知道Book现在实现了IComparable,对它进行比较很容易,但是我们SortHelper 我们需要告诉SortHelper<T>(准确说是告诉编译器),它所接受T类型参数必须能够进行比较,换言之,就是实现IComparable接口,这便是本小节主题:约束。 ,会看到下面的输出: Id:45 Title:.Net之美 Id:124 Title:C# 3.0揭秘 除了可以约束类型参数T实现某个接口以外,还可以约束T是一个结构、T是一个、T拥有构造函数、T继承自某个等 总结 本节中我们学习了掌握所需要最基本知识,你看到了需要原因,它可以避免重复代码,还学习到了如何使用类型参数约束和方法。拥有了本节知识,你足以应付日常开发中大部分场景。

    29070

    2022年Unity面试题分享

    链接: B站刘铁猛C#入门精要. ---- 【重点面试题】3、装箱和拆箱区别 值类型和引用类型最终是Object 装箱:值类型转换成引用类型过程,生成新引用 拆箱;引用类型转换成值类型过程 不支持指针,但可以使用Unsafe,不安全模式,CLR不检测 C#可以定义指针类型、整数、实数、struct结构体 C#指针操作符、C#指针定义 使用fixed,可以操作类型 相同点 . ---- 【重点面试题】32、是什么 多个代码对 【不同数据类型】 执行 【相同指令】情况 :多个类型共享一组代码 允许类型参数化,类型类型模板 5种、结构、接口 、委托、方法 类型占位符 T 来表示 不是实际,而是模板 从类型创建实例 声明类型》通过提供【真实类型】创建构造函数类型》从构造类型创建实例 <T1,T2> 类型参数 ,且只有一种 Func里前者和方法参数类型相同,最后一个与返回值类型相同 一般用于回调方法,注册事件,直接数据交互松耦合 链接: 参考资料. ---- 【重点面试题】35、unity常用资源路径有哪些

    14510

    2.1.1 示例:诞生前集合 .NET 1有如下3大集合。数组:语言和运行时直接支持数组。数组大小在初始化时就已经确定。普通对象集合:API中值(或者键)由System.Object描述。 同样,当声明有或者接口时,形参也可以用作或者接口实参,比如声明List<T>实现自接口IEnumerable<T>:public class List<T> : IEnumerable 2.1.3 适用范围 并非所有类型或者类型成员都适用。对于类型,这很好区分,因为可供声明类型比较有限:枚举不能声明为,而、结构体、接口以及委托这些可以声明为类型直接调用构造器实现代码比较烦琐:new Tuple<int, string, int>(10, "x", 20) 但是使用静态方法配合类型推断,代码就简单多了4:4前面说过构造器不能为,构造器中参数实际上是来自它所在类型形参 假设有一个定义如下:如果要获取它类型,得到类型将包含一个具体类型形参(string)和一个类型形参形式类型实参(T)。

    10210

    C#入门集合、方法、约束、委托

    不然 集合和ArrayList装箱拆箱 常见类型 方法 约束 委托 ###很难理解? 定义主要有以下两种: 1.在程序编码中一些包含类型参数类型,也就是说参数只可以代表,不能代表个别对象。(这是当今较常见定义) 2.在程序编码中一些包含参数。 Food… 声明和方法时只需要传入类型地方用 ,有点类似于占位符作用,用时候传入具体类型。 :这个常用api通用接口。 where T:<名> 类型参数必须是指定或派生自指定。 where T:<接口名称> 类型参数必须是指定接口或实现指定接口。可以指定多个接口约束。约束接口也可以是

    13130

    C#.NET Web 部分复习总结(面试常问)

    C#是一种编程语言,可以基于.NET平台应用。 值类型和引用类型区别? 在C#中值类型变量直接存储数据,而引用类型变量持有的是数据引用,数据存储在数据堆中。 类型参数概念引入 .NET Framework,这样就可以设计具有以下特征和方法:在客户端代码声明并初始化这些和方法之前,这些和方法会延迟指定一个或多个类型最常见用途是创建集合。 .NET Framework 库在 System.Collections.Generic 命名空间中包含几个新集合。 应尽可能使用这些来代替某些,如 System.Collections 命名空间中 ArrayList。 可以创建自己接口、方法、事件和委托。 可以对进行约束以访问特定数据类型方法。 在数据类型中所用类型信息可在运行时通过使用反射来获取。

    44421

    C#基础篇——

    c#中,通过尖括号“<>”将类型参数括起来,表示。声明接口时,与声明一般接口唯一区别是增加了一个<T>。一般来说,声明接口与声明非接口遵循相同规则。 T:<名> 类型参数必须是指定或派生自指定。 T:<接口名称> 类型参数必须是指定接口或实现指定接口。可以指定多个接口约束。约束接口也可以是。 可以看到,在接口T前面有一个out关键字修饰,而且T只能是返回值类型,不能作为参数类型,这就是协变。使用了协变以后,左边声明,右边可以声明基或者子类。 注意 1.代码中 default 关键字 在方法中会出现一个问题是,如何把缺省值赋给参数化类型,此时无法预先知道以下两点: T将是值类型还是引用类型 如果T是值类型,那么T将是数值还是结构 通常情况下,建议您使用集合,因为这样可以获得类型安全直接优点而不需要从集合类型派生并实现类型特定成员。

    25540

    了解C#协变和逆变

    前言 在引用类型系统时,协变、逆变和不变性具有如下定义。 这些示例假定一个名为 Base 和一个名为 Derived派生。 在C#中,目前只有接口和委托可以支持协变和逆变, 协变(Covariance) 内置协变接口,IEnumerator<T>、IQuerable<T>、IGrouping<Tkey, TElement out关键子标识,并且占位符T只能用于只读属性、方法或者委托返回值,out简而易懂,就是输出意思 当要进行类型转换,占位符T要转换目标类型也必须是其,上述例子则是Foo隐式转为FooBase 当要进行类型转换,占位符T要转换目标类型也必须是其子类,上述例子则是FooBase转为Foo 总结 协变和逆变只对委托和接口有效,对普通方法无效 协变和逆变类型必须是引用类型 ,因为值类型不具备继承性,因此类型转换存在不兼容性 接口和委托可同时存在协变和逆变类型参数,即占位符T 参考 协变和逆变 | Microsoft Docs 《你必须知道.NET(第2

    9310

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • 云服务器

      云服务器

      云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。 腾讯云服务器(CVM)为您提供安全可靠的弹性云计算服务。只需几分钟,您就可以在云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券