Android 智能转换与KOTLIN中的显式转换有何不同

Android 智能转换与KOTLIN中的显式转换有何不同,android,performance,kotlin,optimization,casting,Android,Performance,Kotlin,Optimization,Casting,最近,我读到了有关由is操作符执行的智能转换,以及关于as或更好的as?操作符的信息,这些操作符用于显式转换 kotlin文档的使用差异如下:- 请注意,如果编译器无法保证变量不能在检查和使用之间更改,则智能强制转换不起作用。更具体地说,智能强制转换根据以下规则适用: val局部变量-始终不包括局部委托属性 val属性-如果属性是私有的或内部的,或检查 在声明属性的同一模块中执行。聪明的 强制转换不适用于打开的属性或具有 定制吸气剂 变量局部变量-如果变量未在 检查并在修改它的lambda

最近,我读到了有关由
is
操作符执行的智能转换,以及关于
as
或更好的
as?
操作符的信息,这些操作符用于显式转换

kotlin文档的使用差异如下:-

请注意,如果编译器无法保证变量不能在检查和使用之间更改,则智能强制转换不起作用。更具体地说,智能强制转换根据以下规则适用:

  • val局部变量-始终不包括局部委托属性

  • val属性-如果属性是私有的或内部的,或检查 在声明属性的同一模块中执行。聪明的 强制转换不适用于打开的属性或具有 定制吸气剂

  • 变量局部变量-如果变量未在 检查并在修改它的lambda中不捕获用法, 并且不是本地委托财产

  • 变量属性-从不(),因为变量可以随时修改 按其他代码显示的时间

请注意,当编译器无法保证 变量不能在检查和使用之间更改

上面写的有点让人困惑,因为
var
变量可以在初始化后更改,我找不到一个例子来说明语句的实际细节。

不管怎样,有人能更容易地理解这一观点吗?


并且
is
操作符是否比
as
操作符提供了一些优化好处,如果有的话?

智能强制转换的想法是帮助您避免使用
as
as?
来显式强制转换已检查的内容。至于上面的要点,这里有一些例子

  • val局部变量-由于val是最终的(无法更改),因此在执行检查后,该变量可以进行智能转换,因为它不能再次更改
  • val属性-如果直接访问(通过默认getter),则可以进行智能转换。如果通过自定义getter,那不是因为我们不知道它被修改了
  • var local variables-如果在检查和使用之间未修改变量,则不会在修改它的lambda中捕获,并且不是本地委托属性
var属性-var总是可以被代码中的其他内容修改,因此smart cast不起作用

class Example {
    var a: Int? = 2

    fun test1() {
        if (a is Int) {
            // smart cast is impossible because we don't know whether 'a' was changed by some other code/function
            val b = a * 2 // won't work
        }
    }
}
就使用
而言,如果您查看最后一个示例:

class Example {
    var a: Int? = 2

    fun test1() {
        if (a is Int) {
            // smart cast is impossible because we don't know whether 'a' was changed by some other code/function
            val b = a as Int * 2 // this WILL work because we forcefully cast it to Int, but if a is null there will be an exception in runtime
        }
    }
}
当您不确定var是否可以转换为某个值时,也可以将
用作?
。如果不是,它只会给你一个空值。例如:

val a: Double = 2.0
val b = a as? String // 'b' will be 'String?', in this case initialized to 'null' since 'a' cannot be cast to it

val c: Int? = 2
val d = c as? Int // 'd' will be '2' but still 'Int?' since 'as?' always makes the variable nullable
希望这些例子对我有所帮助,如果我需要进一步澄清,请告诉我

class Example {
    var a: Int? = 2

    fun test1() {
        if (a is Int) {
            // smart cast is impossible because we don't know whether 'a' was changed by some other code/function
            val b = a * 2 // won't work
        }
    }
}
class Example {
    var a: Int? = 2

    fun test1() {
        if (a is Int) {
            // smart cast is impossible because we don't know whether 'a' was changed by some other code/function
            val b = a as Int * 2 // this WILL work because we forcefully cast it to Int, but if a is null there will be an exception in runtime
        }
    }
}
val a: Double = 2.0
val b = a as? String // 'b' will be 'String?', in this case initialized to 'null' since 'a' cannot be cast to it

val c: Int? = 2
val d = c as? Int // 'd' will be '2' but still 'Int?' since 'as?' always makes the variable nullable