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

一文了解 JavaKotlin

阅读本文你将了解:什么是变、协变、逆变和不变在 Java 和 Kotlin 如何实现以上变Java 和 Kotlin 异同在 Java/Kotlin ,子类对象是可以赋值给一个父类型...extends Animal 表示此方法可以接受 Animal 或者 Animal 子类集合,这就使得类型协变了逆变同理,有时候我们希望把父对象作为实参传递给子类形参,例如// 用于监听小动物是否饿了监听器...:声明处变:声明时候定义使用变:使用时候定义变// 声明处变: 声明时候,就指定了类型参数为 out T, 此时是协变interface SourceA {}// 声明时候没有指定型变,此时该类型interface SourceB {}// 使用变: 使用 SourceB 作为参数时候,我们指定了类型参数为 out...具体化(Reified)有时候我们需要在函数体中使用类型参数,获取类型参数具体信息,比如对类型参数进行类型判断、类型转换等,因为类型擦除原因,这个 Java 是无法实现:public

88520

一文了解 JavaKotlin

阅读本文你将了解:什么是变、协变、逆变和不变在 Java 和 Kotlin 如何实现以上变Java 和 Kotlin 异同在 Java/Kotlin ,子类对象是可以赋值给一个父类型...extends Animal 表示此方法可以接受 Animal 或者 Animal 子类集合,这就使得类型协变了逆变同理,有时候我们希望把父对象作为实参传递给子类形参,例如// 用于监听小动物是否饿了监听器...:声明处变:声明时候定义使用变:使用时候定义变// 声明处变: 声明时候,就指定了类型参数为 out T, 此时是协变interface SourceA {}// 声明时候没有指定型变,此时该类型interface SourceB {}// 使用变: 使用 SourceB 作为参数时候,我们指定了类型参数为 out...具体化(Reified)有时候我们需要在函数体中使用类型参数,获取类型参数具体信息,比如对类型参数进行类型判断、类型转换等,因为类型擦除原因,这个 Java 是无法实现:public

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

Kotlin run、let、with、apply、also、takeIf、takeUnless 语法糖使用和原理分析

带接收者函数字面值 使用这些语法糖之前回顾一下 Kotlin 函数式编程,分析 Kotlin 使用 Anko 构建布局 文章中有提到 带接收者函数字面值。...而 invoke 变量是作为参数递给 exec 函数,如果 exec 函数为空,那么 inkoke 具体实现 show 方法也不会被调用 exec 调用 invoke 方法如下: fun...receObj.invoke() // 把 ReceiceObject 作为参数递给 invoke 调用 invoke(receObj) } exec 具体调用,...拓展函数 拓展函数相当于给某个添加函数,但这个函数并不属于这个函数,和 static 方法是两码事。...,使用 this 指代被拓展实例,上面代码 this 指代就是 Context 。

1.6K11

Kotlin】扩展函数 ① ( 扩展函数简介 | 为 Any 超定义扩展函数 | private 私有扩展函数 | 扩展函数 | 标准函数 let 函数扩展函数 )

扩展函数 , 可以 不修改 原有 情况下 增加功能 ; Kotlin 如果类 没有被 open 关键字修饰 , 则该类 不能被继承 , 如果想要扩展该类 , 可以使用 扩展函数 ; 扩展函数...可以作用于 自定义 , 也可以作用于 系统自带 , 如 String , List , 等 标准库 API ; 为 某个 定义扩展函数 , 格式为 : fun 名.扩展函数名(参数列表...就是 接收者参数类型 ; fun T.函数名(参数列表): T { 函数体 } 代码示例 : 该代码 , 定义了一个 扩展函数 , 为 T 定义了扩展函数 printSelf...let 函数扩展函数 ---- 标准库 let 函数 , 就是 扩展函数 , inline 关键字表明该函数是 内联函数 , 其中 匿名函数 参数在编译时直接将函数体拷贝到使用位置...表达式作为参数函数定义为内联函数 | 内联函数本质 - 宏替换 ) 博客进行理解 ; Kotlin 标准库函数 , 参考 【Kotlin】标准库函数总结 ( apply 函数 | let 函数

1.6K20

Kotlin 进阶 知识详解

前言 详细介绍Kotlin关于知识。方便我们理解Kotlin使用。 如果对于知识不太了解,也可以通过本篇文章了解到底是什么,并且对我们开发到底有什么作用。...我们可以函数声明,属性声明,声明和接口声明中使用。下面也从这四个维度进行介绍Kotlin使用。 1.声明函数 例如,我们声明一个比较函数。...Kotlin定义和java其实很类似。都是使用来进行标注。 小知识:并不是必须用T字母来代替。...s1 = Demo.zinyan.isEquals(12, 23); } 上面这种是我们接口约束方法,还有一种情况就是定义函数时候,约定值只能是指定以及其父才行...我们默认没有定义类型其实就是省略了:Any类型而已。 2. 声明属性 我们在上面的示例中了解了定义,函数使用。下面我们介绍类属性声明和使用

20930

Kotlin变之路

kotlin修炼指南7之 ,是为了让「」、「接口」、「方法」具有更加通用使用范围而诞生,举个例子,假如我们不使用,那么一个List可以装得下任何对象,这么做问题就在于,使用时,需要对类型进行检查...但是这种处理我们处理业务时,会有很多限制,所以,提供了「变」来拓展使用。 协变 协变指的是,当参数具有父子关系时,子类可以作为参数传递,而上界就是其父。...约定,当参数T只会用来输出时,可以申明时候,直接使用协变约束,这样调用时候,就不用额外使用协变了,当然写了也不会错。...那么我们实际代码,要在哪些场景使用协变和逆变呢?通常来说,参数协变后则表示——「这个参数在当前,只能作为函数返回值,或者是只读属性」。...「只能作为函数参数,或者修饰可变属性」。

1.2K21

Kotlin】扩展函数总结 ★ ( 超扩展函数 | 私有扩展函数 | 扩展函数 | 扩展属性 | 定义扩展文件 | infix 关键字用法 | 重命名扩展函数 | 标准库扩展函数 )

就是 接收者参数类型 ; fun T.函数名(参数列表): T { 函数体 } 代码示例 : 该代码 , 定义了一个 扩展函数 , 为 T 定义了扩展函数 printSelf..., 函数打印 接收者 , 并将接收者返回 , 该可以是任意类型 ; main 函数 , 先调用 字符串实力对象 printSelf 扩展函数打印自身 , 然后调用 字符串扩展函数...let 函数扩展函数 ---- 标准库 let 函数 , 就是 扩展函数 , inline 关键字表明该函数是 内联函数 , 其中 匿名函数 参数在编译时直接将函数体拷贝到使用位置...表达式作为参数函数定义为内联函数 | 内联函数本质 - 宏替换 ) 博客进行理解 ; Kotlin 标准库函数 , 参考 【Kotlin】标准库函数总结 ( apply 函数 | let 函数...代码 ; 标准库 let 函数 , 就是 扩展函数 , inline 关键字表明该函数是 内联函数 , 其中 匿名函数 参数在编译时直接将函数体拷贝到使用位置 , 避免创建匿名函数相关对象

2.2K30

Kotlin 开发者角度看 Java 缺失特性

= computeNullableString() 扩展函数 Java ,扩展一哥是通过继承来实现: 继承有两个主要问题。第一个问题是有些不允许继承:它们使用了 final 修饰符。...这是不得已而为之,因为 Java 不允许方法存在于之外。 通过这种方式,如果某个方法不存在于某个,辅助就提供这样一个方法,这个方法将这个作为参数并执行所需操作。...它语法要清晰得多,并且允许函数链接,这在 Java 是不可能做到。 具体化 Java 5 引入了。...与之相反是具体化,也就是说,类型将被写入字节码。 编译时类型存在一些问题。...论 在这篇文章,我描述了 Java 缺失 4 个 Kotlin 特性:不可变引用、空安全、扩展函数和具体化

77020

Kotlin 1.2 新增特性

例如,当一个 lambda 作为构造函数参数递给一个对象时,后者可以用于引用另一个必须稍后定义对象: lateinit修饰符现在可以用在顶级属性和局部变量上。...例如,当作为构造函数参数递给一个对象 lambda 引用另一个对象时,稍后必须定义对象可以使用: 循环中值:1, 2, 3, 1, 2, 3, 1, ......如果调用一个返回类型参数 T 并将返回值转换为特定类型 Foo 方法,则编译器现在可以理解此调用 T 需要绑定到 Foo 类型。...弃用:扩展 Throwable 内部类 继承自 Throwable 内部类可能会违反 throw-catch 场景类型安全性,因此已被弃用, Kotlin 1.2 中会被警告,...这可能会影响应用程序整体性能;仅在多个之间共享一些复杂状态并在初始化时更新时才使用它。 “手工”解决方法是将控制流子表达式值存储变量,而不是直接在调用参数对它们进行求值。

2.8K70

Kotlin Vocabulary | Reified: 类型擦除后再生计划

解决这一问题一个方法,是将实际代表类型信息作为一个参数递给函数。...为了达到这一目标,Kotlin 提供了一个特别的关键字 reified,使用它就可以函数获取所需类型信息。只要您对实现方式有所了解,就可能会不禁惊呼: 这怎么可能!...若是要在参数使用 reified,那首先需要将函数标记为 inline,然后参数之前添加 reified 关键字即可。...从反编译后代码可以发现,当调用 reified 修饰内联函数时,编译器会复制该函数体,并将类型替换为实际使用类型。这样,您就可以不用将递给函数也能够获取到相应类型信息了。...另外请牢记,Java 代码不能访问被 reified 修饰函数。Java 不支持内联,也就意味着 Java 参数不能逃脱被编译器擦除类型命运。

1.2K10

Kotlin | 9.

本章内容包括: 声明函数 类型擦除和实化类型参数 声明点变型和使用点变型 9.1 类型参数 // 如果要创建一个空列表,必须显示指定,有值的话可以被推导出来...* - 调调用带实化类型参数函数时候使用非实化类型形参作为类型实参 * - 把、属性或者非内联函数类型参数标记为reified */ 9.3...会提示报错 // println(Validators[String::class].validate(42)) 总结 Kotlin 和 Java 相当接近:它们使用同样方式声明函数...可以声明一个某个类型参数上是协变,如果该参数只是用在 out 位置。 逆变情况正好相反:可以声明一个某个类型参数上是逆变,如果该参数只是用在 in 位置。...Kotlin 既可以为整个指定变型(声明点变型),也可以为类型特定使用指定变型(使用点变型)。 当确切类型实参是未知或者不重要时候,可以使用星号投影语法。

1.8K10

Kotlin学习之路(4)函数运用

通过两者对比,咱们可以发现 ① Java使用@Override表示该函数重载父方法,而Kotlin使用小写override 同一行表达重载操作 ② Java 使用 protected /...,就跟调用arrayOf方法一样,只需函数名称后面加即可 内联函数 前面我们定义函数appendString时,是把它作为一个全局函数,也就是外定义,而不是内部定义。...因为成员依赖于,只有才能拥有成员函数,而普通是不允许定义函数,否则编译器直接报错。...不过也有例外当参数都是继承于某种类型,那么允许定义函数时指定从这个基化开,凡是继承自该基子类,都可以作为输入参数进行调用,反之无法调用!...如果要让该方法同事接收整型和双精度数组入参,那就得使用T 来自于基Number 将改为,同时fun前面加上关键字inline,表示该函数属于内联函数

72710

kotlin基础语法

super.foo()切换实现方法,两个都有时也可以通过这个方式切换实现方法 ,即 "参数化类型",将类型参数化,可以用在,接口,方法上。...声明一个: class Class(t: T) { var value = t } Kotlin 没有通配符类型,它有两个其他东西:声明处变(declaration-site...我们可以使用约束来设定一个给定参数允许使用类型。...Kotlin使用 : 对类型上限进行约束。...如果你使用匿名对象作为公有函数 返回类型或者用作公有属性类型,那么该函数或属性实际类型 会是匿名对象声明超类型,如果你没有声明任何超类型,就会是 Any。匿名对象 添加成员将无法访问。

2.1K20

Kotlin学习日志(四)函数

一、函数基本用法 函数这个词相信各位不会陌生,而Kotlin也是使用了众多函数,正所谓面向函数编程。...{ ... } 对比区别如下: (1)Java使用“@Override”表示该函数重载父方法,而Kotlin使用小写“override”同一行表达重载操作 (2)Java使用“public”...,要是函数不存在返回参数,也就是Java返回void,Java中使用void表示不存在返回参数,而Kotlin返回参数是一定存在,即使开发者不声明任何返回参数Kotlin函数也会默认返回一个Unit...我这一顿操作意义何在呢?不是说默认参数吗?请听我慢慢道来,Kotlin引入了默认参数概念,允许定义函数时直接指定输入参数默认值。...如果要让该方法同时接收整型和双精度数组入参,就得指定变量T来自于基Number,即将“”改为“”,同时fun前面添加关键字inline,表示该函数属于内联函数

1.8K10

Kotlin 1.2 新增了哪些特性?

例如,当一个 lambda 作为构造函数参数递给一个对象时,后者可以用于引用另一个必须稍后定义对象: lateinit修饰符现在可以用在顶级属性和局部变量上。...例如,当作为构造函数参数递给一个对象 lambda 引用另一个对象时,稍后必须定义对象可以使用: ? 循环中值:1, 2, 3, 1, 2, 3, 1, ......如果调用一个返回类型参数 T 并将返回值转换为特定类型 Foo 方法,则编译器现在可以理解此调用 T 需要绑定到 Foo 类型。...弃用:扩展 Throwable 内部类 继承自 Throwable 内部类可能会违反 throw-catch 场景类型安全性,因此已被弃用, Kotlin 1.2 中会被警告,...这可能会影响应用程序整体性能;仅在多个之间共享一些复杂状态并在初始化时更新时才使用它。 “手工”解决方法是将控制流子表达式值存储变量,而不是直接在调用参数对它们进行求值。

2.8K10

Kotlin总结 ★ ( | 参数 | 函数 | 多参数 | 类型约束 | 可变参数结合 | out 协变 | in 逆变 | reified 检查参数类型 )

放在 尖括号 , 该参数放在 名后 , 主构造函数之前 , 该参数 T 是 类型占位符 , 可以使用 类型占位符 T 作为一个 使用 , 可以 定义 T 类型成员属性...都使用 T 来表示 ; 代码示例 : 下面的代码 , 声明了 Student , 该 接收 T 类型参数 , 主构造函数接收 T 类型参数 , 声明了 T..., 需要两个参数来表示其类型 ; T 类型中注明 , 可以 Student 随意使用 , 但是 参数 R 是首次函数使用 , 因此需要在该函数 fun 关键字...子类对象 ; , 如果只将 类型 作为 函数参数 类型 , 则在 声明 参数 类型 时 , 参数使用 in 关键字 , 同时 该 又称为 消费...(t: T) } 十、 invariant 不变 ---- , 如果 既将 类型 作为 函数参数 类型 , 又将 类型 作为 函数返回值 类型 , 则在 声明 参数

3.8K10

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

- 当 Nothing 作为函数参数时,就意味着这个**函数永远无法被正常调用**。这在星投影时候是有一定应用。 - Nothing 可以看作是 Nothing?... Java ,我们常见有:接口、方法和属性,Kotlin 系统继承了 Java 系统,同时添加了一些强化地方。...### 接口/类型) 定义类型,是类型名之后、主构造函数之前用尖括号括起大写字母类型参数指定: ### 声明接口 > Java: ``` //接口 interface...= tClass.newInstance() return t } ``` ### 约束 Java 可以通过有界类型参数来限制参数类型边界,Kotlin约束也可以限制参数类型上界...in位置,而函数返回类型叫作out位置 #### 协变 :保留子类型化关系 如果在定义方法参数前面加上out关键词,说明这个方法是协变,简单来说类型A是类型B子类型

42450

Kotlin入门(11)江湖绝技之特殊函数

,这正是对象写法,“Array”可称作变量,至于arrayOf便是本文要说函数了。...) } count++ } 内联函数 注意到前面定义函数appendString,是把它作为一个全局函数,也就是外面定义,不在内部定义。...因为成员函数依赖于,只有(又称模板)才能拥有成员函数,普通是不允许定义函数,否则编译器会直接报错。...不过有个例外情况,如果参数类型都是继承自某种类型,那么允许定义函数时指定从这个基化开,凡是继承自该基子类,都可以作为输入参数进行函数调用,反之则无法调用函数。...显然这么做代价不菲,所以Kotlin引入了高阶函数这个秘密武器,直接把这个算法作为参数进来,由开发者调用高阶函数时再指定具体算法函数

1.2K10
领券