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

Effective Kotlin 译文:Chapter3-Item24-泛型型变

这并不是巧合,正是因为 Kotlin ,所有函数类型参数类型是逆变,而函数类型返回类型是协变: 这并不是 Kotlin 唯一一个支持型变类型,还有一个更加常见支持协变类型就是 List...我们可以往入参处传入任意类型,很显然这个是很危险: class Box { private var value: T?...Kotlin List, Kotlin , List 只提供了可读方法,因此 List 声明处定义成了协变(使用 out) 对应,逆变类型参数如果放在公有的输出位置,也会存在问题...因此,为了避免这种情况发生,Kotlin 在编译时禁止了这种行为:Kotlin 禁止公有的输出位置使用逆变类型参数: class Box { var value: T?...译者注: Java 只有使用处型变 总结 Kotlin 强大泛型类型,并且支持使用声明处型变以及使用处型变 默认类型参数是不型变 out 修饰符可以使类型参数协变 in 修饰符可以使类型参数逆变

57710

Effective Kotlin 译文:Chapter3-Item24-泛型型变

type_hierarchy.png] Kotlin 类型继承体系 这并不是巧合,正是因为 Kotlin ,所有函数类型参数类型是逆变,而函数类型返回类型是协变...我们可以往入参处传入任意类型,很显然这个是很危险: class Box { private var value: T?...Kotlin List, Kotlin , List 只提供了可读方法,因此 List 声明处定义成了协变(使用 out) 对应,逆变类型参数如果放在公有的输出位置,也会存在问题...因此,为了避免这种情况发生,Kotlin 在编译时禁止了这种行为:Kotlin 禁止公有的输出位置使用逆变类型参数: class Box { var value: T?...译者注: Java 只有使用处型变 总结 Kotlin 强大泛型类型,并且支持使用声明处型变以及使用处型变 默认类型参数是不型变 out 修饰符可以使类型参数协变 in 修饰符可以使类型参数逆变

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

Kotlin初探

2 配置 我们AndroidStudio开发工具,要想使用Kotlin这个优秀开发语言,我们需要安装插件,直接在安装插件界面搜索Kotlin然后安装。...Kotlin语法,语句结尾都不在有分号“;”。 Kotlin变量声明两种类型,val修饰变量是只读变量即只能赋值一次,再次赋值时就会编译错误 ,如果我们需要多次修改值就需要使用var。...如果我们使用下面赋值语句str=null,发现null是不能赋值,这就是Kotlin特性,如果我们想赋值null,可以修改为 var str:String?=""。...简洁性,我们创建一个Staff类,String类型name,position和泛型T(使用泛型仅仅是为了Kotlin接触以下泛型) java实现代码: Kotlin数据类: 通过对比我们就看出了优点了...Kotlin没有这个关键字,而是伴生对象,具体用法 使用的话直接People.ID。 13 单例模式 Kotlin中使用object修饰类时候,该类是单例对象。

1.6K20

kotlin入门之泛型

Java泛型类型会在编译时发生类型擦除,为了保证类型安全,不允许这样赋值、 至于什么是类型擦除,等下再讲。 实际使用,我们的确会用这种类似的需求,需要实现上面这种赋值。...我们看看在使用上界通配符后,List使用上有没有什么问题: List<?...表示List泛型类型是一个未知类型 super限制了这个未知类型下界,也就是这个泛型类型必须满足这个super 限制条件 super我们方法里面经常用到,这里范围不仅包括Button...说完了Java泛型之后,我们回头看一下kotlin泛型。 kotlin out和in kotlin和java泛型一样,kotlin泛型本身也是不可变。...var list: List 和 Java 不同地方是,如果你类型定义里已经了out或者 in, 那这个限制变量声明时也依然,不会被*号去掉。

1.1K20

聊聊kotlinval跟var

了解kotlin,最先接触就是val跟var了,下面详细说说这两个字段特性 val val:英文读value,代表是immutable, 只读意思 比如下面这个kotlin代码 val item...方法没有了 其实这种写法,真的是非常优雅; 对于java来说,很多人声明一个变量时候,常常忘记加final修饰语,从而埋下了隐患,比如这个变量传到其他方法,或者再其他使用,不小心给他重新赋值,...或者把这个变量置空,导致了其他不可预期问题 但是kotlin只需要一个val就可以快速实现这个特性,很方便优雅 这一点,java圣经《Effective Java》,也有提及,叫做: Minimize...所以使用val是一种更安全,更不容易出错写法,再后续开发,应该尽量使用val修饰符 就像里面所说 var var:英文读variable,变量意思,也就是指mutable 比如下面这个kotlin...跟set方法都变了 简简单val跟var,其实隐藏了很多信息,这里做个介绍 任何疑问,欢迎微信交流

1.1K20

Better Kotlin

截止到明天早上 9 点,点赞最多找我小奖励哟~ 我想给大家一些小建议 这么有趣活动,那我作为一名两个月 Kotlin 开发,自然也应该来这个活动凑凑热闹。... Kotlin ,val 和 var 是用于表示属性是否 getter/setter: var:同时有 getter 和 setter。 val:只有 getter。...5 by lazy 和 lateinit 相爱相杀 Android 开发,我们经常会有不少成员变量需要在 onCreate() 对其进行初始化,特别是我们 XML 中使用各种控件,而 Kotlin...6 注意 Kotlin for 循环 Kotlin提供了 downTo、step、until、reversed 等函数来帮助开发者更简单使用 For 循环,如果单一使用这些函数确实是方便简洁又高效...7 注意 Kotlin 可空和不可空 最近闹了一个笑话,项目中需要写一个上传跳绳数据功能。于是了下面的代码。

1.2K20

干货|Kotlin入门第一课:从对比Java开始

除了代码量上不同,还得关注data关键字和类名后面紧跟属性列表。 先看参数列表,这里其实对应是Java参构造函数。...解释完变量定义时关于空概念,接下来就该看看这种保护机制能否真的让我们省心。就拿获取字串长度为例,KotlinString类个length属性,即调用方式为strObject.length。...两种形式定义变量不用担心(1 类型为String且不允许为null;2 类不包含length属性), 理由很简单,前者不会出现null异常,后者获取length属性在编译阶段就会出错,或者说敲完代码时编译器就会标红提示了...属性; 第5-7行,不会执行到if代码块,这里用了类似Java做法; 第9行,输出”8″,到这里,相比能体会到Kotlin智能之处了,第八行对str2赋值之后,就不会再像第二行那样报编译错误了...因为Java如果既不能改变原有类,又想在其基础上添加方法,就得通过新建类来继承方式。 而现实是Java只能是单继承,这个机会太珍贵了,更残酷是有些类还是不能继承

969110

Kotlin入门(28)Application单例化

Application是Android又一大组件,App运行过程且仅有一个Application对象贯穿应用整个生命周期,所以适合在Application中保存应用运行时全局变量。...,该方法返回第一步声明Application类实例; 不管是代码还是步骤,这个单例化实现都还蛮简单。...= instance     } } 第二种方式委托属性单例化,App代码获取Application实例与第一种方式是一样,都是调用“MainApplication.instance()”这个函数获得...三、自定义委托行为单例化 前两种单例化都只完成了非空校验,还不是严格意义上单例化。真正单例化是且仅有一次赋值操作,尽管前两种单例化并未实现唯一赋值功能,但是大多数场合已经够用了。...getValue方法中进行非空校验,setValue方法中进行重复赋值校验,从而按照要求接管了委托属性读写行为。

2.2K30

Kotlin学习之路(3)控制语句

【运算符与表达式】 (1)一些常用运算符 Java支持运算符(算术运算符 赋值运算符拓展后赋值运算符 逻辑运算符)Kotlin这些运算符也全部支持。...【条件分支】 (1)简单分支 提起判断语句肯定是大家耳熟能详if…eles…语句了,Kotlin中用法与Java语法仍然是一样。...取值A:取值B),但是Kotlin不提供这个三元运算符,因为Kotlin if…eles 已经实现了这个功能。...但是Kotlin这个限制被去掉了,进行分支处理时候允许引入变量进行判断。...在我看来这些方法过于繁琐,日常开发因为业务是千变万化,并非几种固定模式,虽然Kotlin废除了for(初始;条件;增减) 这个规则,但是开发者可以使用while语句实现相关功能,Kotlin

63120

Kotlin入门(13)类成员众生相

上一篇文章介绍了类简单定义及其构造方式,当时为了方便观察演示结果,示例代码构造函数中直接调用toast提示方法,但实际开发是不能这么干。...其实此处代码逻辑很简单,仅仅是把构造函数输入参数保存到类属性,不管输入参数几个,该类都依样画瓢声明同样数量属性字段并加以赋值。...下面是补充了新属性之后类代码: class WildAnimalMember (var name:String, val sex:Int = 0) { //非空成员属性必须在声明时赋值或者构造函数赋值...利用伴生对象技术,即可间接实现静态成员功能,前面有个代码从性别类型获得性别名称,反过来也可以从性别名称获得性别类型,这个功能便可以伴生对象定义一个judgeSex方法判断性别类型。...像这种特定含义类型数值,更好办法是采取实际意义常量名称,Android便存在Color.RED、Color.GREEN、Color.BLUE等等颜色常量,从它们名称能够直接对应到颜色数值。

55220

Kotlin安卓开发学习(2)

这就是Kotlin不同地方,Kotlin任何一个非抽象类默认都是不可以被继承,相当于Java给类声明了final关键字。...Java中继承关键字是extends,而在Kotlin变成了一个冒号,写法如下: class Student : Person() { var sno = "" var grade...另外,由于构造函数参数是创建实例时候传入,不像之前写法那样还得重新赋值,因此我们可以将参数全部声明成val。...这就涉及了Java继承特性一个规定,子类构造函数必须调用父类构造函数,这个规定在Kotlin也要遵守。...根据继承特性规定,子类构造函数必须调用父类构造函数,可是主构造函数并没有函数体。Kotlin当然没有采用这种设计,而是用了另外一种简单但是可能不太好理解设计方式:括号。

35520

Kotlin入门(3)基本变量类型用法

上一篇文章介绍了KotlinApp开发简单用法,包括操纵控件对象、设置控件监听器,以及弹出Toast提示等等。...也许大家已经迫不及待想要了解更深入App开发,可是由于Kotlin是一门全新语言,与Java相比自己一套语法和关键字,正所谓皮之不存、毛将焉附,因此接下来还是得系统地学习Kotlin语法知识,...可是如果你马上敲个变量声明代码,便会发现编译问题。...另外一个重要区别是类型转换,Java开发,像int、long、float、double变量,可以直接在变量名前面加上诸如(int)、(long)、(float)、(double)这种前缀进行强制类型转换...其实val和var区别在于,前者修饰过变量,只能在第一次声明时赋值,后续不能再赋值;而后者修饰过变量,任何时候都允许赋值

75120

Kotlin面向对象编程,深入讨论继承写法问题

Java中继承关键字是extends,而在Kotlin变成了一个冒号,写法如下: class Student : Person() { var sno = "" var grade...另外由于构造函数参数是创建实例时候传入,不像之前写法那样还得重新赋值,因此我们可以将参数全部声明成val。...Kotlin当然没有采用这种设计,而是用了另外一种简单但是可能不太好理解设计方式:括号。子类主构造函数调用父类哪个构造函数,通过父类后面加上括号来指定。...val,因为主构造函数声明成val或者var参数将成为全局变量,这就会导致和父类同名name和age字段造成冲突。...但是,Kotlin括号这个问题上复杂度还没有到此为止,因为我们还没涉及到Kotlin构造函数另一个组成部分,次构造函数。 其实次构造函数我本来是不太想讲,因为我们几乎上用不到它。

81630

Kotlin干掉了findViewById,但用不好也会有性能问题

Kotlin 个非常便捷特性,就是无需再使用 findViewById() 方法,Kotlin 可以直接通过 View ID 来访问 View 并进行操作,该特性被称为「静态布局引入」。...这一切 Kotlin 中就被简化了,只需要利用 View ID 就可以直接访问到这个 View。...Kotlin 干掉了 findViewById 2.1 如何使用? 想使用这个特性,还需要一些简单配置,不过 Android Studio ,我们支持 Kotlin 时候就已经自动配置完成。...2.2 Activity 实现 我们知道,无论 Kotlin 干了什么,最好办法是直接查看 Bytecode 来分析其原理。...这很简单,没什么好说。 2.3 Fragment 实现 Fragment 当然也可以这么使用,但是稍许不同。

2.6K10

From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了

没有 int/Intege Short 16 Kotlin 没有 short Byte 8 Kotlin 没有 byte Kotlin 语言体系当中,是没有原始类型这个概念。.../u>类型, Kotlin 世界里,函数是一等公民 既然变量可以类型,函数也可以类型。...--- 函数引用(Function reference) 普通变量引用概念,我们可以将一个变量赋值给另一个变量,这一点,函数上也是同样适用,函数也有引用,并且也可以赋值给变量。...(var2); } --- 总结 Kotlin,函数引用和函数调用以下区别: 函数引用可以视为函数类型变量,它持有函数引用。...run(); } Kotlin 可以用 fun 修饰符 Kotlin 声明一个函数式接口: // 注意 interface 前 fun fun interface KRunnable {

1.2K80

Kotlin Android】一个列表带你领略Kotlin简洁之风

来表明这个变量可能为null,并赋值为null; 第四种方式,如果你只想声明变量,那么可以使用lateinit关键来表明该变量在后面才进行初始化(注:基础类变量不能指定为lateinit,并且lateinit...了以上基本了解后,我们就可以开始动手来搭建一个简单页面,动手过程来进一步深入学习。...xml声明好id可以直接在Activity中使用,如上面的listView,无需代码再次去声明和定义,Kotlin会自动帮你映射。...Java,如果想要配置LayoutManager,需要调用listViewsetLayoutManager()方法,Kotlin,我们只需直接将LayoutManager赋值给layoutManager...最后 以上,简单介绍了Kotlin一些最基础语法,以及用了一个列表展示例子初步了解和学习了Kotlin开发中会使用到一些最基础知识以及可能产生疑惑地方,也向大家展示了Kotlin如帮组我们精简代码

1.8K10

KotlinKotlin 语言基础 ( 环境安装 | 变量 | 简单使用 | 函数 | 异常 | 递归 )

3.查看创建 Kotlin 工程 : 4. src 下创建一个 Kotlin 文件 : ---- ( 2 ) Kotlin Hello World 代码 Hello World 代码...== 等价于 Java equals() 方法; 2.忽略大小写方法 : Kotlin, equals 第二个参数, 将第二个参数设置为 true, 即忽略大小写对比字符串内容是否相等 ; 3..." var name3 : String = "Joe" //Kotlin == 是字符串对比, 不是 地址对比, == 等价于 Java equals 方法 println(name1...可以直接 赋给一个变量, 这个变量就是 函数变量, 类似于 C 函数指针; //3.定义函数变量, 类似于 C 函数指针, 返回值 使用 -> 标识 var plus_3 = {a : Int..., b : Int -> a + b} 4.定义带类型函数变量 : 赋值给 函数 变量 可以 声明一个类型, 这个类型由 参数 -> 返回值 组成, 在对应函数定义 {} 只使用变量名称对应类型即可

3.7K00

3. 类型声明与空安全(Void Safety)

Kotlin ,不可能为空变量和可能为空变量被强行分开了(Java @Nullable 和 @NonNull 注释,但只会提供警告)。那 Kotlin 为什么要这样设计呢?...Kotlin 非空类型/可空类型(NonNull/Nullable)声明 最开始时我们提到: Kotlin ,不可能为空变量和可能为空变量被强行分开了。具体是怎么分开呢?...string5 = "123" // 编译器报错了 } 观察 string1,string2 我们可以得出: 当你像 Java 那样声明一个 String 对象时候,他之后赋值也是不能被赋值为空...Kotlin 可空(Nullable)传递性 如果一个可空对象调用了方法,因为这个方法可能不被执行,那么如果我们接收它返回值,那么返回值类型应该是什么呢?...我们继续使用上面A这个类,来看看这个例子: /** 很普通一个类,一个“成员变量”,一个返回该变量方法 **/ class A { var code = 0 fun getMyCode

97450

Kotlin语言基础入门:Kotlin简介

一,简介 Kotlin 是一种富有表现力且简洁编程语言,不仅可以减少常见代码错误,还可以轻松集成到现有应用。...更安全代码:Kotlin 许多语言功能,可帮助你避免null指针异常等常见编程错误。 可互操作:可以 Kotlin 代码调用 Java 代码,或者 Java 代码调用 Kotlin 代码。...no initializer is provided c = 3 // 这里是推迟赋值 可以多次赋值变量用关键字var var x = 5 // 自动推测出是Int型 x += 1...创建类与实例 定义一个类,使用class关键字 class Fisher 类属性可以放在定义或者类里。比如下面这个类Rectangle,描述长方形。...字符串模版(String tempplates) 直接使用变量,用$ 要使用表达式,需要用大括号${} var a = 1 // 简单使用$ val s1 = "a is $a" a = 2 //

89020
领券