什么?泛型本身也可以是nullable?上来就抛这么个问题实在是不够友好~

首先回顾,什么是泛型?Oracle Java Tutorials

Introduced in J2SE 5.0, this long-awaited enhancement to the type system allows a type or method to operate on objects of various types while providing compile-time type safety. It adds compile-time type safety to the Collections Framework and eliminates the drudgery of casting.

泛型的本质是参数化类型,也就是说操作的数据类型被指定为一个参数。简单来讲,泛型就是操作类型的占位符。

那,为什么要使用泛型?Oracle Java Tutorials

In a nutshell, generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. Much like the more familiar formal parameters used in method declarations, type parameters provide a way for you to re-use the same code with different inputs. The difference is that the inputs to formal parameters are values, while the inputs to type parameters are types.

泛型的好处是在编译的时候做类型安全检查,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

在深入讨论泛型的可空性之前,首先看一个简单的例子 (kotlin中更多泛型的介绍,以及其与java泛型的区别,可以查看Generics)

    fun <T> whoAmI(t: T) {val clazz = t::classprintln("I'm $clazz")}

上面的代码是编译不过的,问题在于

nullable type 'T'是什么鬼?OK,我们按照提示,为参数t加上!!强制标识为not-null (关于!!的使用,可以查看 Null Safety)

WTF~ 哔~ 卒~

在继续讨论之前,先关注两个概念,type parametertype argument,在一个函数中,前者是函数参数的类型(类型),如translate(java.lang.String, java.lang.String)中的java.lang.String,而后者则是函数调用时传入的具体值(类型),如translate("Hello You!", "zh-cn")中的Hello Youzh-cn,泛型作为一个占位符,占的正是type parameter的位

首先简单了解一下argument的可空性,kotlin中控制函数参数值(类属性值等)的nullable是通过?符号实现的,默认均为non-nullable,如以下代码片段是编译不过的

只有指定参数namenullable,才可以顺利编译

同样,对应泛型类,我们也可以指定nullablenon-nullabletype argument

从上例中可以看到,null在kotlin中的类型为Nothing?(kotlin中一切皆为对象)

更多内容请参考 Null Safety

说了这么多,到底什么是泛型的可空性(type argumentnullable)?

上例中,之所以可以将forestA指定为Forest<Tree?>,是因为,每一个nullabletype argument都有一个隐式边界Any?,即如下两种类声明完全等价

    // T的隐式边界为Any?class Forest<T>// 显示指定T的边界为Any?class Forest<T : Any?>// 显示指定T的边界为Tree?class Forest<T : Tree?>

如果将Forest中的泛型强制指定为non-nullable会发生什么

什么?不能将nullableTree?应用到Forest类了!这是因为Forest类的定义中,我们强制将泛型的边界指定为了non-nullableTree

所以,回到文章的开头,函数whoAmI的错误信息nullable type 'T'指的是哪个鬼?泛型T的默认边界为Any?,即T : Any?,所以,我们只需要显示指定Tnon-nullable即可

至此,对于nullablenon-nullabletype parametertype argument是否有所了解?

聊一聊泛型的可空性(kotlin)相关推荐

  1. 聊一聊泛型的可空性 (kotlin)

    什么?泛型本身也可以是nullable?上来就抛这么个问题实在是不够友好~ 首先回顾,什么是泛型?Oracle Java Tutorials Introduced in J2SE 5.0, this ...

  2. Kotlin教程(九)泛型

    写在开头:本人打算开始写一个Kotlin系列的教程,一是使自己记忆和理解的更加深刻,二是可以分享给同样想学习Kotlin的同学.系列文章的知识点会以<Kotlin实战>这本书中顺序编写,在 ...

  3. Kotlin语言中的泛型设计哲学

    Kotlin语言的泛型设计很有意思,但并不容易看懂.关于这个部分的官方文档,我反复看了好几次,终于弄明白Kotlin语言泛型设计的背后哲学.这篇文章将讲述Kotlin泛型设计的整个思考过程及其背后的哲 ...

  4. Java泛型与Kotlin泛型

    正文 本文主要列举Java泛型与Kotlin泛型的基本知识,以及两者的区别. 什么泛型 泛型程序设计是程序设计的一种风格或或规范.简单的说就是该类型可变,在编写代码时可以根据情况设置不同的类型.因为泛 ...

  5. Kotlin 全部基础

    IDEA Kotlin 提供了很多便利,简化了java很多模式化代码.有人说可读性相对较差,习惯之后,会觉得Java不好读.比如:中文思维会觉得英语很难理解,相反而至.每个都要敲代码,磨刀不误砍柴工. ...

  6. 从Java到Kotlin(三)

    本篇文章主要对比Java跟Kotlin中的类和接口的写法. 目录 一.类的声明 二.构造函数 三.函数的参数 四.创建类的实例 五.数据类 六.枚举类 七.属性 八.内部类 九.可见性修饰符 十.继承 ...

  7. java 泛型 t_Kotlin(2) 泛型与集合

    前言 以一个java老鸟的角度,如何去看 kotlin.Java源代码应该如何用Kotlin重构.如何正确学习kotlin并且应用到实际开发中.本文将会探究. 本文分两大块,重难点和潜规则. 重难点: ...

  8. 从Java到Kotlin(五)

    函数与Lambda表达式 目录 一.函数声明与调用 二.参数和返回值 三.单表达式函数 四.函数作用域 五.泛型函数 六.尾递归函数 七.中缀表示法 八.Lambda表达式的语法 九.高阶函数与Lam ...

  9. 买《Kotlin从小白到大牛》专题视频课程,送配套纸质图书

    经过一年多时间的呕心沥血,Kotlin立体化图书--<Kotlin从小白到大牛>即将与大家见面了.所谓立体化图书包括:电子图书.视频.课件和服务等内容. <Kotlin从小白到大牛& ...

最新文章

  1. ftp使用(图文详解)
  2. Jmeter加Fiddler对web项目测试
  3. C#子线程中更新ui
  4. [转]COM对象创建-外部机制
  5. Coding:在数组中查找具有给定总和的对
  6. ::的类名前有个 ,什么意思?
  7. JeecgBoot低代码平台 2.4.5 版本发布,钉钉与企业微信集成版本
  8. 嵌入式Linux系统编程学习之三十四 Socket 编程
  9. docker下centos7 systemctl启动报错 docker Failed to get D-Bus connection 报错
  10. Color the ball(树状数组区间更新+单点求值)
  11. Oracle、plsql安装以及使用教程
  12. 大数据之clickhouse各类引擎
  13. Python 的图形用户界面
  14. 美式期权损益图matlab,一看就懂,盈亏全在图上了,超实用的期权损益图绘制
  15. jQuery插件,UI
  16. nnet3-chain-copy-egs用于chain模型输入数据
  17. mysql数据库服务器重启_重启mysql数据库服务器
  18. 文件上传与下载SmartUpload
  19. Tkinter实现窗口菜单栏
  20. 考研打破了原本的人生规划,其实开始并不难

热门文章

  1. [MSDN]关键字查询语言 (KQL) 语法参考
  2. css动画在线生成,在线制作css动画——cssanimate
  3. 养生医学背景PPT模板
  4. php安全新闻早八点-高级持续渗透-第一季关于后门
  5. 批量实现excel中的地名转为经纬度
  6. [转帖]三星F488E的JAVA安装方法
  7. 按下鼠标中键跳转新的页面
  8. 第03章 Tableau基础操作
  9. 云付注册推荐人怎么填?云付新手怎么操作
  10. Web前端开发 北京林业大学 CSS样式-单元作业