首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#基础篇——泛型

action是实例化了一个只有一个字符串参数没有返回值得函数变量。func是实例化了一个有两个int类型参数返回int函数变量。...可以看到,泛型接口T前面有一个out关键字修饰,而且T只能是返回类型,不能作为参数类型,这就是。使用了以后,左边声明是基类,右边可以声明基类或者基类子类。...泛型类,T类型不同,每个不同T类型,都会产生一个不同副本,所以会产生不同静态属性、不同静态构造函数,请看下面的例子: public class GenericCache { static...从上面的截图中可以看出,泛型会为不同类型都创建一个副本,所以静态构造函数会执行5次。而且每次静态属性值都是一样。利用泛型这一特性,可以实现缓存。 注意:只能为不同类型缓存一次。...如果该列表返回默认值.

1.3K40

kotlin基础语法

.* 函数定义 函数定义使用关键字 fun,参数格式:参数 : 类型 fun printSum(a: Int,b: Int){ println(a+b) } 无返回函数 public fun...如果子类没有主构造函数,则必须在每一个二级构造函数中用 super 关键字初始化基类,或者代理另一个构造函数。...声明处类型变异使用注解修饰符:in、out,消费者 in, 生产者 out。...使用 out 使得一个类型参数类型参数只能用作输出,可以作为返回类型但是无法作为入参类型: in 使得一个类型参数逆,逆类型参数只能用作输入,可以作为入参类型但是无法作为返回类型...如果你使用匿名对象作为公有函数 返回类型或者用作公有属性类型,那么该函数属性实际类型 会是匿名对象声明类型,如果你没有声明任何超类型,就会是 Any。匿名对象 添加成员将无法访问。

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

是时候使用Kotlin编程了

Kotlin是开源,这意味着,我们可以GitHub上下载Kotlin全部源代码,并对它进行代码修改再发布,Kotlingithub开源地址: https://github.com/JetBrains...并且,Kotlin还提供了智能类型判断功能,使用is类型判断后,编译器自动进行类型转换,父类引用可以调用子类接口,注意转换只is代码块中生效。...2,函数定义 函数使用fun关键字进行声明,变量冒号之后是变量类型函数冒号之后是返回值。...伴生对象调用跟Java一样,通过类名.属性名称或函数名称调用。 新特性 1,安全 Kotlin,对象声明分为可引用和非引用两种。...Java泛型是不变,比如:虽然A继承B,但List和List之间没有任何关系,Java是通过泛型通配符来实现型: 3,反射 反射是运行于JVM程序检测和修改运行时一种行为,通过反射可以在运行时获取对象属性和方法

3.2K10

Kotlin基本语法和使用技巧

安全调⽤用符 kotlin默认不能,变量类型后面跟?号定义,表明这是一个可类型 ?. 代表着如果该类型的话就返回null不做后续操作,如果不为的话才会去访问对应方法或者属性 !!....代表着如果该类型的话就抛出NullPointerException,如果不为空就去访问对应方法或者属性, 所以只有很少特定场景才用这种符号,代表着程序不处理这种异常case了,会像java代码一样抛出...类似静态变量 写在顶级函数(不需要在class里写方法)或者变量有个好处: Android Studio 写代码时,IDE 很容易根据你写函数前几个字母自动联想出相应函数。...因此就诞生了「泛型」,它意思是把具体类型泛化,编码时候用符号来指代类型使用时候,再确定它类型 使用关键字 out 来支持,等同于 Java 上界通配符 ? extends。...程就是kotlin官方提供线程api 属性委托 有些常见属性操作,我们可以通过委托方式,让它实现,例如:lazy 延迟属性: 值只第一次访问时候计算 类委托 可以通过类委托来减少 extend

83650

Android 序列化框架 Gson 原理分析,可以优化吗?

序列化时,首先使用反射获取字段值,再使用字段 BoundFiled 序列化; 反序列化时,首先创建对象实例(下文会讨论如何创建),再使用依次使用字段 BoundField 反序列为字段类型值,...1、预置容器 TypAdapter ,会先通过容器类型 RawType 获取容器构造器,再根据泛型实参 elementType 获取元素类型 TypeAdapter; 2、序列化时,先写入...[ 左括号,再用元素类型 TypeAdapter 依次序列化元素对象,再写入 ] 右括号; 3、反序列化时,先创建集合对象,再用元素类型 TypeAdapter 依次反序列化元素对象; 4、Map...这个 API 不会调用构造函数,因此相关构造初始化操作会丢失; 1、构造函数参数默认值丢失; 2、字段默认值丢失; 3、Kotlin 非类型失效; 4、初始化块未执行; 5、by 属性代理(没有创建代理对象...原理是 Class 文件 Signature 属性会保持类签名信息,而 TypeToken 只是一个工具类,内部通过反射获取类签名泛型信息并返回 Type 类型

2.1K50

Kotlin互操作——Kotlin与Java互相调用

安全类型 Kotlin安全类型原理是,Kotlin在编译过程中会增加一个函数调用,对参数类型或者返回类型进行控制,开发者可以开发时通过注解@Nullable和@NotNull方式来弥补Java...;和逆由Javaextends和super变成了out和in,如ArrayList;Kotlin没有Raw类型,如JavaList对应于Kotlin就是List并不是Box子类。...当它作为参数出现时,为了让KotlinAPIJava工作,对于定义Box生成Box作为Box(或者对于逆定义Foo生成Foo<?...因此,将示例对应函数实际翻译如下: // 作为返回类型——没有通配符 Box boxDerived(Derived value) { … } // 作为参数——有通配符 Base

3.7K10

C# 发展历史及版本新功能介绍

到达迭代器方法结尾时,循环便已完成。 和逆 C# 和逆能够实现数组类型、委托类型和泛型类型参数隐式引用转换。 保留分配兼容性,逆则与之相反。...我们来看看此版本一些主要功能: 自动实现属性 C# 3.0 及更高版本,当属性访问器不需要任何其他逻辑时,自动实现属性会使属性声明更加简洁。 它们还允许客户端代码创建对象。...LINQ 构造可以建立更细微视图检查表达式树、Lambda 表达式以及匿名类型基础。 不过无论如何 C# 3.0 都提出了革命性概念。...泛型类型参数支持和逆,可在分配和使用泛型类型方面提供更大灵活性。 引用类型系统时,、逆和不变性具有如下定义。... C# 4.0 版引入 dynamic 关键字让用户可以替代编译时类型编译器。 通过使用 dynamic 关键字,可以创建和动态类型语言(例如 JavaScript)类似的构造

4.2K20

From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了

除了对于函数返回类型返回自动补充之外,它特殊之处更多地在于语义和用途角度。它是由官方规定,用于表示**「什么也不返回」**场景**返回类型**。... Kotlin ,不存在真正没有返回函数,所有「没有返回值」函数实质返回类型都是 Unit,而返回值也都是 Unit 这个单例对象。...是因为存在特例void,Java如果声明函数没有返回值,那么它就需要用void来修饰。...in位置,而函数返回类型叫作out位置 #### :保留子类型化关系 如果在定义泛型类和泛型方法泛型参数前面加上out关键词,说明这个泛型类及泛型方法是,简单来说类型A是类型B类型...没有子类型化 | | T只能在out 位置 | T只能在 in 位置 | T可以在任何位置 | ### 泛型out与in与 Java 上下界通配符关系 Kotlinout代表,in代表逆

41750

阿里云大神亲码“Kotlin深度笔记”,不讲一句废话,全是精华

基本类型、包、控制流、返回与跳转 image.png 3.类和对象 主要内容:类和继承、属性和字段、接口、可见性修饰词、扩展、数据对象、泛型、嵌套类、枚举类、对象表达式和声明、代理模式、代理属性 4.函数和...lambda表达式 主要内容:函数、高阶函数与 lambda 表达式 image.png 5.其它 主要内容:多重申明,Ranges,类型检查和自动转换,This表达式,等式,运算符重载,安全,异常,...定义常量与变量 null 声明 判断 字符串拼接 三元表达式 多重条件 更灵活 case 语句 for 循环 更方便集合操作 遍历 方法定义 constructor 构造器 Get Set 构造器...Java 重载, Kotlin 怎么巧妙过渡一下? Kotlin 姿势 Kotlin 复写 Java 父类方法 Kotlin “狠”起来,连TODO 都不放过!...Delegation) 委托属性(Property Delegation) 自定义委托属性 委托属性 + SharedPreferences 程“不为人知”调试技巧 程 JVM 参数 Kotlin

1.1K10

面试总结-C++

执行函数时, 函数内局部变量存储单元都可以创建 ,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集。 (3)从堆上分配 , 亦称动态内存分配 。...static关键字 作用: 函数体内 static 变量作用范围函数体,不同于 auto 变量, 该变量内存只被分配一次,因此其值在下次调用时维持上次模块内 static 全局变量可以被模块内所有函数访问...16} 宏函数属于结构插入代码,没有返回值;函数调用具有返回值。...- 指针free或delete之后没有及时置 => 释放操作后立即置。 ##### 指针和数组区别 数组要么静态存储区被创建(如全局数组),要么被创建。...(1)操作符new返回指针类型严格与对象匹配,而不是void; (2)C很多以void参数函数可以改写C++模板函数,而模板是支持类型检查; (3)引入const关键字代替#define constants

2.1K11

Typescript 严格模式有多严格?

5.strictPropertyInitialization 此规则将验证构造函数内部初始化前后已定义属性。 必须要确保每个实例属性都有初始值,可以构造函数里或者属性定义时赋值。...username = user.username.toLowerCase(); 方案#3:构造函数赋值 最有用解决方案是向username构造函数添加参数,然后将其分配给username属性。...这一更严格检查应用于除方法或构造函数声明以外所有函数类型。方法被专门排除在外是为了确保带泛型类和接口(如 Array )总体仍然保持。...用另一种方式来描述这个例子则是,默认类型检查模式T类型(x: T) => void是 双,但在严格函数类型模式T是 抗: interface Comparer { compare...[2] 应该怎么理解编程语言中?[3] TypeScript 严格函数类型[4] 面试过程,常被问到为什么Typescript比JavaScript好用?

2K40

Typescript 使用日志(干货)

类中使用方式和在变量类似,只是提供了一些专门类设计静态属性、静态方法、成员属性构造函数类型等。...给我们提供了一下两种兼容方式: 以 A = B 这个表达式例: •,表示 B 结构体必须包含 A 所有结构,即:B 属性可以比 A 多,但不能少。...•逆,和协变相反,即:B 所有属性都在 A 能找到,可以比 A 少。•双向,即没有规则,B 属性可以比 A 多,也可以比 A 少。 对象兼容 对象兼容,采用。...函数返回值兼容 函数返回兼容,采用。...•animal => animal •返回值不对,返回值始终是,必须多传。 •animal => grayDog •正确。 所以,函数参数类型应该是逆

2.4K10

Kotlin与Java互操作

安全类型 Kotlin安全类型原理是,Kotlin在编译过程中会增加一个函数调用,对参数类型或者返回类型进行控制,开发者可以开发时通过注解@Nullable和@NotNull方式来限制Java...;和逆由Javaextends和super变成了out和in,如ArrayList;Kotlin没有Raw类型,如JavaList对应于Kotlin就是List。...getID(C c) { return c.ID; } } 延迟初始属性Java)也会暴露字段, 该字段可见性与 lateinit 属性 setter 相同。...我们可以这样写 unboxBase(boxDerived(“s”)),但是 Java 是行不通,因为 Java 类 Box 在其泛型参数 T 是不型,于是 Box 并不是 Box 子类...当它作为参数出现时,为了让 Kotlin API Java 工作,对于定义 Box 我们生成 Box 作为 Box // 作为返回类型——没有通配符 Box boxDerived

3.4K30

快速理解 TypeScript 和协

因为这个函数调用时候是按照 Guang 来约束类型,但实际函数只用到了父类型 Person 属性和方法,当然不会有问题,依然是类型安全。...这就是逆函数参数有逆性质(而返回值是,也就是子类型可以赋值给父类型)。 那反过来呢,如果 printHoobies 赋值给 printName 会发生什么?...但是这明显是有问题,不能保证类型安全,所以之后 ts 加了一个编译选项 strictFunctionTypes,设置 true 就只支持函数参数,设置 false 则是双向。...开启之后,函数参数就只支持逆,子类型赋值给父类型就会报错: 类型编程这种逆变性质有什么用呢? 还记得之前联合转交叉实现么?...结果就是交叉类型: 我们通过构造了多个函数类型,然后模式提取参数类型方式,来实现了联合转交叉,这里就是因为函数参数是逆,会返回联合类型几个类型类型,也就是更具体交叉类型

1.6K40

Typescript 严格模式有多严格?

5.strictPropertyInitialization 此规则将验证构造函数内部初始化前后已定义属性。 必须要确保每个实例属性都有初始值,可以构造函数里或者属性定义时赋值。...username = user.username.toLowerCase(); 方案#3:构造函数赋值 最有用解决方案是向username构造函数添加参数,然后将其分配给username属性。...这一更严格检查应用于除方法或构造函数声明以外所有函数类型。方法被专门排除在外是为了确保带泛型类和接口(如 Array )总体仍然保持。...用另一种方式来描述这个例子则是,默认类型检查模式T类型(x: T) => void是 双,但在严格函数类型模式T是 抗: interface Comparer { compare...[2] 应该怎么理解编程语言中?[3] TypeScript 严格函数类型[4] 面试过程,常被问到为什么Typescript比JavaScript好用?

3K20

深入 TypeScript 类型、逆,进阶 Vue3 源码前必须搞懂

类型系统属性更多类型是子类型集合论属性更少集合是子集。 也就是说,子类型是父类型超集,而父类型是子类型子集,这是直觉容易搞混一点。...当我初学时候,我会觉得 T extends {} 这样语句很奇怪,为什么可以 extends 一个类型并且传递任意类型时都成立呢?当搞明白上面的知识点,这个问题也自然迎刃而解了。...逆和协 先来段维基百科定义: 与逆(covariance and contravariance)是计算机科学,描述具有父/子型别关系多个型别通过型别构造器、构造多个复杂型别之间是否有父...那么,对于 type MakeArray = T[] 这个类型构造器来说,它就是 (Covariance) 。... TS 当然, TypeScript ,由于灵活性等权衡,对于函数参数默认处理是 双向

1.2K31

欢迎来到 C# 9.0(Welcome to C# 9.0)

(即可写),对象初始化器才能工作:它们首先调用对象构造函数(本例是默认无参数构造函数),然后赋值给属性 setter。...(init-only)自动属性以及构造函数和解构函数,因此您就可以编写: var person = new Person("Scott", "Hunter"); // 用位置参数构造(positional...,您可以定义自己同名属性,生成构造函数和解构函数将只使用您自定义属性。...每个派生记录类型都重写此方法以调用该类型复制构造函数,并且派生记录复制构造函数将链接到基记录复制构造函数。with 表达式只需调用隐藏“克隆”方法并将对象初始化器应用于其返回结果。...0 : null; // nullable value type 六、返回值(Covariant returns) 派生类方法重写具有一个比基类型声明更具体(更明确)返回类型——有时这样表达是有用

99830

TS内置类型与拓展

简单来说,类型收敛,逆类型发散。在这里由下面的例子引起关于这个问题讨论,在这里我们定义了一个父类型以及一个子类型,而且我们验证了这个子类型TS是OK。...将一个函数赋给另一个函数变量时,要保证参数类型发散,即比目标类型范围小。目标函数执行时是执行函数,传入参数类型会收敛函数参数类型表示类型收敛,即类型范围缩小或不变,逆变反之。...用合适术语来描述这个奇怪表现,可以说我们允许一个函数类型返回类型,而参数类型是逆。...一个有趣现象是TypeScript,参数类型是双向,也就是说既是又是逆,而这并不安全,但是现在你可以TypeScript 2.6版本通过--strictFunctionTypes...*/ "strictPropertyInitialization": true, /* 设为true后会检查类非undefined属性是否已经构造函数初始化,如果要开启这项,需要同时开启

99210

C# 9.0 新增功能

localsinit 标志 目标类型新表达式 静态匿名函数 目标类型条件表达式 返回类型 扩展 GetEnumerator 支持 foreach 循环 Lambda 弃元参数 本地函数属性...调用方可使用属性初始化表达式语法创建表达式设置这些值,但构造完成后,这些属性将变为只读。 仅限 init 资源库提供了一个窗口用来更改状态。 构造阶段结束时,该窗口关闭。...完成所有初始化(包括属性初始化表达式和 with 表达式)之后,构造阶段实际就结束了。 上述位置记录示例演示了如何使用仅限 init 资源库通过 with 表达式来设置属性。...返回类型替代函数返回类型提供了灵活性。 替代函数返回从基类方法声明返回类型派生类型。 这对于记录和其他支持虚拟克隆或工厂方法类型很有用。...有关详细信息,请参阅 Lambda 表达式一文 Lambda 表达式输入参数一节。 最后,现在可将属性应用于本地函数。 例如,可将可为属性注释应用于本地函数

1.7K20

C#4.0新增功能03 泛型和逆

此示例创建一个 List ( Visual Basic List(Of Derived) ),并且说明可以将该类型传递给 PrintBases 且不进行强制转换情况下将该类型分配给类型...该示例定义具有MustInherit 属性抽象( Visual Basic Shape ) Area 类。...该示例创建 SortedSet 对象 Circle ,使用采用 IComparer ( Visual Basic IComparer(Of Circle) )构造函数。...Func ( Visual Basic Func(Of Base, Base) )变量,因为返回类型。...类型参数用 out 关键字( Visual Basic Out 关键字, + MSIL 汇编程序 )标记。 可以将类型参数用作属于接口方法返回值,或用作委托返回类型

1.3K20
领券