文章目录 一、Kotlin 变量可空性 1、Java 与 Kotlin 空值处理区别 2、Java 函数返回非空值和控制 3、Kotlin 函数调用 Java 函数 4、平台类型 5、@NotNull...3、使用 @JvmName 注解修改 Kotlin 生成的 Java 类名 一、Kotlin 变量可空性 ---- 1、Java 与 Kotlin 空值处理区别 在 Java 语言 中 , 任何 引用类型变量...默认情况下 所有的变量 都为 非空类型 ; 下面分别定义一个 Java 类 和 Kotlin 脚本 , 在 Kotlin 脚本调用调用 Java 类的成员 ; 2、Java 函数返回非空值和控制 代码示例...不知道 这个变量 是否为空 , 这种变量的类型 就称为 " 平台类型 " ; 所有的 平台类型 变量 都是 可空的 , Kotlin 会将其自动推断为 可空类型 ; 调用 平台类型 变量 的成员时 ,...将字节码 反编译回 Java 代码 , 由下面的代码可知 , 在 Hello.kt 脚本 中 定义 sayHello 函数 , 其对应的 字节码 反编译 后 的 Java 代码 如下 : import
1 使用工具互相转换 1.1 将 Java 转换为 Kotlin 如果你之前使用 Java 语言而没有 Kotlin 开发经验,不用担心,Intellij IDEA 会帮你一键转换,将 Java 代码转换成...1.2 将 Kotlin 转换为 Java 另外,通过IDEA的Kotlin插件,可以直接把Kotlin代码ByteCode反编译成Java代码(虽然这个反编译后的Java代码不是那么的的原汁原味)。...var a: String = "abcd" a = null //编译错误 如果要允许为空,我们需要手动声明一个变量为可空字符串类型,写为String? var a: String?...对变量进行了NotNull注解。...翻译成Java代码: @NotNull String a = "abcd" 不仅如此,为了避免NPE异常,Kotlin做了一件很有趣的事:当你允许属性可空时,Kotlin编译器将不允许你在未经检查的情况下引用它
: "empty" /** 如果user为可空类型,又一定要调用它的成员函数和变量,可以用!!...如下 UI().setContentView(this@LoginActivity) 其中,dip(10),表示将10dp转换为像素的意思,是Anko的扩展函数,说到扩展函数,我发现Kotlin源码里大量地使用扩展函数...和 Java 不一样,Kotlin 没有提供单独定义域的方式。你必须使用 val 或者 var 来声明变量。...编译速度对比 我不会试图比较一行代码的编译速度;相反,比较的是将代码从Java转换为Kotlin是否会影响其总体构建的时间。...所以Kotlin编译在完整代码情况下比Java慢一点。 但是你通常只会对几个文件进行更改后编译,所以,我们来看看Kotlin在增量编译是否可以赶上Java。 增量编译 ? ? ?
这也是南尘最开始喜欢使用的方式,没有技术却有一颗装 ✘ 的内心,直接写成 Java 文件,再直接一键转换为 Kotlin。...但将这段简洁的 Kotlin 代码转换为等同的 Java 代码后,却显的晦涩难懂。...核心意思是:Kotlin 使用 object 代替 Java 匿名内部类实现。 很明显,即便如此,这里的访问应该也是合情合理的。从匿名内部类中访问成员变量在 Java 语言中是完全允许的。...7 注意 Kotlin 的可空和不可空 最近闹了一个笑话,在项目中需要写一个上传跳绳数据的功能。于是有了下面的代码。...仔细一看,发现 Java 编写这个接口的时候,会被认为这个参数 "data" 对应的 "value" 是可以为 null 的,而改为 Kotlin 后,由于 Kotlin 默认不为空的机制,所以需要的参数是一个不可以为
在 kotlin 中有多少种构造函数 ---- kotlin 将构造函数分为了两种: 主构造函数和次构造函数。...基于 Java 的空指针提出了一个空安全的概念,即每个属性默认不可为 null。...在某个类中,如果某些成员变量没办法在一开始就初始化,并且又不想使用可空类型(也就是带?的类型)。那么,可以使用 lateinit 或者 by lazy 来修饰它。...lateinit 只能用于修饰变量 var,不能用于可空的属性和 Java 的基本类型。 lateinit 可以在任何位置初始化并且可以初始化多次。...-->show Kotlin Bytecode,将 Person 类反编译成 java 类得到: ?
空类型 在Kotlin对函数有更严格的要求,如在Java中你可以写这样一个方法: public String getName() { return null; } 这样完全是没问题的...length) 定义value是可空类型,但是我明确知道它不是null,那么我们可以使用value!!,表示我已经确定知道这个值不是null,不要给我报编译错误。...总结 val notNull: String = null //错误,不能为空 val nullable: String?...= null //正确,可以为空 notNull.length //正确,不为空的值可以直接使用 nullable.length //错误,可能为空,不能直接获取长度 nullable!!....Chlid//安全强转失败为null 总结: ◆ Java Style类型转换 val sub: SubClass = parent as SubClass 类似于Java的类型转换,失败则抛异常
代码示例: fun main(args: Array) {} 变量声明 Kotlin声明变量可以用var或者 val。...大部分情况下,Kotlin 可以判断变量的类型,所以不用每次都显式声明。...如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换: fun getStringLength(obj: Any): Int?...toString(): String 要使变量保持为null,必须将其显式指定为可空: 在变量类型后面加上? 符号,即声明为可空。 用 ?. 运算符来访问一个可空的变量。 用 ?...: 运算符来指定当该变量为空时的替代值 代码示例: package com.easy.kotlin /** * Created by jack on 2017/5/30. */ fun main
我们今天按照 Kotlin Koan 给出的顺序,要解毒的就是下面这道题: 把下面这段 Java 代码转换为 Kotlin 代码: public class JavaCode { public String...从此以后,我就成了 Kotlin 大神,反正只要用工具把 Java 代码转一下就好啦,还学什么学 >.<! 2....什么玩意,空指针啊 后来我就经常需要将原来用 Java 编写的 Activity 转换为 Kotlin 版本的,例如: public class TestActivity extends Activity...对于平台类型(Platform Type),很多时候转换工具是无从得知它是否可能为空的,毕竟 Java 没有对此作出过任何承诺。 怎么办?...Kotlin 提供了一对注解来标注 Java 类型是否可空:@Nullable 和 @NotNull,Android Support Annotations 这个包也提供了一对:@Nullable 和
② 空安全类型 Kotlin的空安全类型的原理是,Kotlin在编译过程中会增加一个函数调用,对参数类型或者返回类型进行控制,开发者可以在开发时通过注解@Nullable和@NotNull方式来弥补Java...[0]//推断为平台类型(普通Java对象) 当调用平台类型变量的方法时,Kotlin不会在编译时报告可空性错误,但是在运行时调用可能会失败,因为空指针异常。...当把一个平台值赋给一个Kotlin变量时,可以依赖类型推断(该变量会具有所推断出的平台类型,如上例中item所具有的类型),或者选择我们所期望的类型(可空的或非空类型均可)。...=item//允许,没有问题 Val notNull:String=item//允许,运行时可能失败 如果选择非空类型,编译器会在赋值时触发一个断言,这样可以防止Kotlin的非空变量保存空值。...【例5】将Kotlin变量编译成Java中的变量声明。
看下let语法糖的函数声明:public inline fun T.let(block: (T) -> R): R 结合实现,可以看到,let会在block执行完后,返回block的返回值...而Kotlin和Java不同,在Kotlin里每一行代码都是表达式,也就是说每一行代码执行完毕后都有一个返回值。 接下来考虑如下例子: // 例1:可空变量为空 val nullVal: Any?...: run { println("[nullVal] null code block") } // 例2:可空变量为非空 val notnull: Any?...= if (count % 2 == 0) null else Any() 一旦命中这样的坑,查起来挺费劲的 QAQ 掉过这样的坑后,就会发现朴素的if (xxx !...Tips 介绍一个小技巧: IDEA编辑器提供了快速判空的模板,在变量后输入.nn回车。 就能收获如下代码。 PS:nn是notnull的缩写,输入.notnull也有同样的功效。
: 表示 “可以可变或不可变、可空或不可空的 T 的 Java 集合” Array!...: 表示“可空或者不可空的 T(或 T 的子类型)的 Java 数组” Kotlin与Java中的类型映射 Kotlin 特殊处理一部分 Java 类型。...Java 的装箱原始类型映射到对应的可空Kotlin 类型: Java 类型 Kotlin 类型 java.lang.Byte kotlin.Byte?...还要注意,此功能只适用于 Java 互操作;因为 Kotlin 具有合适的函数类型,所以不需要将函数自动转换为 Kotlin 接口的实现。...的属性名以 is 开头,则使用不同的名称映射规则: getter 的名称直接使用属性名称 setter 的名称是通过将 is 替换为 set 获得。
1、空类型安全 1.1、可空类型正确用法 kotlin是强类型判断的,每一个对象都有可以为空和不可以为空之分。...as的推荐写法: //正确写法,转换失败自动转换为空对象 var strAble = text as?...对于 Null 的检查是 Kotlin 的特点之一。强制你在编码过程中考虑变量是否可为 null,因此可以避免很多在 Java 中隐藏的 NullPointerException。!!...secondaryList[0] } 但是,当你用插件直接将 Java 代码转换为 Kotlin 时,你会发现有很多 !! 在里面。但其实 !!...原因是:Person在被转Java代码时,只会生成一个包含两个参数的构造方法,没有提供默认的构造方法。Gson在通过反射创建对象时,会优先尝试获取无参构造函数。
item = list[0] // 推断为平台类型(普通 Java 对象) 当调用平台类型变量的方法时,Kotlin不会在编译时报告可空性错误,但是在运行时调用可能会失败,因为空指针异常。...当把一个平台值赋给一个Kotlin变量时,可以依赖类型推断(该变量会具有所推断出的平台类型,如上例中item所具有的类型),或者选择我们所期望的类型(可空的或非空类型均可)。...=item//允许,没有问题 Val notNull:String=item//允许,运行时可能失败 如果选择非空类型,编译器会在赋值时触发一个断言,这样可以防止Kotlin的非空变量保存空值。...例如,将Kotlin变量编译成Java中的变量声明。...使用@JvmField注解标注后,该字段将具有与底层属性相同的可见性。
Kotlin的类型系统和Java相比,首要的区别就是Kotlin对可空类型的显式支持。 在本节中,我们将讨论Kotlin中的可空类型。...4.5.2 Kotlin中的null 在Kotlin中,针对Java中的null的杂乱局面,进行了整顿,作了清晰的界定,并在编译器级别强制规范了可空null变量类型的使用。...来声明一个可以指向空指针的变量。 可空类型可以用来标记任何一个变量,来表明这个变量是可空的(Nullable)。例如: Char?, Int?, MineType?(自定义的类型)等等。...@NotNull标注不可空的变量,使用注解@Nullable标注一个变量可空。...可空变量的安全调用符y?.length 等价的Java代码就是: y != null?Integer.valueOf(y.length()):null 可空变量的断言调用y!!.
Kotlin作为Android开发第一语言,然而身边做Android的大多还是使用java。...() { companion object { var INSTANCE: APP by Delegates.notNull() } override fun onCreate...() { INSTANCE = this } } 如上代码,在伴生对象中声名变量,并使用netNull委托避免Kotlin中的空异常检查,然后在onCreate中赋值 第二种...>类型转换为Array>类型 */ fun Map换为px sp(spValue) // sp转换为px px2dip/px2sp // px转换为dip或者sp Anko
**Java 构造器成员变量如果依赖构造参数,它们的声明和最终赋值是分离的,同一个成员变量的代码是低内聚的。...使用 let 闭包后,成员变量的所有的初始化代码都可以写在闭包内。不同的成员变量初始化代码相互独立,代码是低耦合的; 3....这样的设计一是为了 Java 转 Kotlin 代码时能兼容旧代码结构,不用重构也能直接转换为 Kotlin 代码;二也方便了 Java 转 Kotlin 自动化工具的实现。...Kotlin 构造器实现分析 上面我们简单的过了一遍 Kotlin 对 Java 构造器的优化,但 Java 采用这样的设计,是因为它忠实的反映了 JVM 的构造器实现。...我们直接看一下 Kotlin 编译再反编译后的字节码: public RecordingBottomView(@NotNull Context context, @Nullable AttributeSet
let{//表示object不为null的条件下,才会去执行let函数体 it.todo() } let函数的kotlin和Java转化 //kotlin fun main(args: Array...场景二: 然后就是需要去明确一个变量所处特定的作用域范围内可以使用 with with函数使用的一般结构 with(object){ //todo } with函数的kotlin和Java...和Java转化 //java public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull...,在run函数中可以像let函数一样做判空处理 apply apply函数使用的一般结构 object.apply{ //todo } apply函数的kotlin和Java转化 //java...also函数编译后的class文件 //java public final class AlsoFunctionKt { public static final void main(@NotNull
将Java自动转换为Kotlin,JetBrains将IntelliJ集成了一个新功能,将Java转换为Kotlin,节省了大量的时间。而且它也节省了我们重新编写代码。...Kotlin的空安全性很好,现在摆脱NullPointerExceptions。这种类型的系统帮助我们避免空指针异常。...在Kotlin系统中,系统只拒绝编译尝试分配或返回null的代码考虑以下示例 不同之处 变量:Java中需要明确变量类型,Kotlin中普通变量用var,常量用val,val常量不能被修改。...可先赋值给变量再操作 空安全:Kotlin中需要明确说明该变量是否为null,用来必免空异常。编辑器会自动检测。如果需要为空,需要在变量后加?...小技巧 如果不知道Kotlin怎么写时,可以写一个Java的,然后用Idea的Java代码转Kotlin功能转换一下 Kotlin的传参写法:str: String,名字在前,类型在后 ... ----
我永远喜欢燕结芽" } println(text.length) // error, cannot smart cast to String } 稍有常识的人都会看出,如果我们的代码继续执行,这个可空类型的...text 变量,在最后一行那里不可能为 null。...所以如果要享受到 Smart Cast 的便利的话,可以手动将 isNullOrEmpty 内联展开: if(text == null || text.isEmpty()) { text = "我永远喜欢燕结芽...IDEA 里这些代码仍然会被标上红色下划线表示有错,但是加上编译器参数后的确能通过编译,也能够正常运行。...// KotlinMain.kt // 用kotlin写具体实现以干掉IDEA强大的Java代码分析功能 fun isNullOrEmpty(cs: CharSequence?)
可空类型 默认声明的变量是不能为 null 的,如果要使变量能为 null, 需要添加 ?操作符。...= if ... else null 安全空访问 智能类型转换是一个相当好的特点,可以安全访问可空变量。例如: var name: String? = "harry" if (name !...name 非空断言 有时候,要将可空的变量转成非空的, 常见于Java, 我们知道变量是不可能为 null 的, 可以用非空断言 !!。例如: val nullableString: String?...Kotlin采用了一种不同的null处理方式。它对可空类型和不可空类型作了区分,可空的类型后面会跟一个问号,比如Bar?,而Bar类型的变量则不可为空。...于是,在Kotlin中,上述Java代码就变成了下面这样: public fun foo(bar : Bar) { /*…*/ } Kotlin非常简洁且富有表现力。这从上面的例子可见一斑。
领取专属 10元无门槛券
手把手带您无忧上云