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

Kotlin智能强制转换不适用于扩展函数

。在Kotlin中,智能强制转换(Smart Cast)是一种编译器特性,它允许我们在某些情况下省略类型转换的显式调用。智能强制转换只适用于局部变量和属性,而不适用于扩展函数。

扩展函数是一种在已有类中添加新函数的方式,它通过定义一个函数并将该函数与目标类进行关联来实现。尽管扩展函数可以像普通函数一样在目标类的实例上调用,但是由于扩展函数并不是目标类的成员函数,因此智能强制转换不适用于扩展函数。

在使用扩展函数时,如果需要进行类型转换,仍然需要显式地使用类型转换操作符(as)来进行转换。例如:

代码语言:txt
复制
fun Any?.toStringOrNull(): String? {
    return this as? String
}

在上述示例中,我们定义了一个扩展函数toStringOrNull(),它将任意类型转换为字符串类型。由于扩展函数不适用智能强制转换,我们需要使用as?操作符进行安全转换,以避免可能的类型转换异常。

总结起来,Kotlin智能强制转换不适用于扩展函数。在使用扩展函数时,如果需要进行类型转换,需要显式地使用类型转换操作符进行转换。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

不要用Java的语法思维来写Kotlin

智能转换(Smart Casts) 对于不可变的值,Kotlin一般不需要显式转换对象类型,编译器能跟踪is检查类型,在需要时会自动插入类型转换代码(安全): fun classCast(a: Any)...{ print(a.length) // a 自动转换为字符串 } //智能转换(smart casts)也用于when表达式和while循环 when (a)...is操作符和变量使用之间不可改变时,智能转换不能用。智能转换的适用条件或规则: val局部变量-总是适用! val属性-适用于private或internal,或者类型检查is/!...is在声明属性的同一模块中执行; 不适用于open的属性,或者具有自定义getter的属性! var局部变量—适用于变量在类型检查和使用之间没有修改,且不在修改它的lambda中捕获!...数组或列表有一个成员或扩展函数iterator()实现了Iterator接口,且该接口提供了next()与hasNext()两个成员或扩展函数 其一般和while循环一起使用 可以查看Array.kt

3K40

写了多年的Java,直到看到Kotlin,原来代码可以如此优雅!

智能转换(Smart Casts) 对于不可变的值,Kotlin一般不需要显式转换对象类型,编译器能跟踪is检查类型,在需要时会自动插入类型转换代码(安全): fun classCast(a: Any...print(a.length) // a 自动转换为字符串 } //智能转换(smart casts)也用于when表达式和while循环 when (a) {...is 操作符和变量使用之间不可改变时,智能转换不能用。智能转换的适用条件或规则: val局部变量-总是适用! val属性-适用于private或internal,或者类型检查is/!...is在声明属性的同一模块中执行; 不适用于open的属性,或者具有自定义getter的属性! var局部变量—适用于变量在类型检查和使用之间没有修改,且不在修改它的lambda中捕获!...数组或列表有一个成员或扩展函数iterator()实现了Iterator接口,且该接口提供了next()与hasNext()两个成员或扩展函数 其一般和while循环一起使用 可以查看Array.kt

3.3K40
  • Kotlin实用的语法糖:空安全、类型转换 & 相等性判断

    今天,我将主要讲解,关于Kotlin的一些实用语法糖,主要包括: 范围使用:in、downTo、step、until 类型检查 & 转换:is、智能转换、as 相等性:equals()、== 、 ===...类型检查 & 转换 包括:is、智能转换 和 as /** * 1. is * 作用:判断一个对象与指定的类型是否一致 **/ // 判断变量a的数据类型是否是String var a: Any...智能转换 * 说明: kotlin不必使用显式类型转换操作,因为编译器会跟踪不可变值的is检查以及显式转换,并在需要时自动插入(安全的)转换 **/ var a: Any = "a" if (a...智能转换不适用于 open 的属性或者具有自定义 getter 的属性; // 3. var 局部变量——如果变量在检查和使用之间没有修改、没有在会修改它的 lambda 中捕获、并且不是局部委托属性;...强制类型转换:as **/ var any: Any = "abc" var str: String = any as String // 强制类型转换是不安全的,若类型不兼容则会抛出一个异常 var

    1.2K11

    Kotlin实用语法糖:空安全、类型转换 & 相等性判断

    今天,我将主要讲解,关于Kotlin的一些实用语法糖,主要包括: 范围使用:in、downTo、step、until 类型检查 & 转换:is、智能转换、as 相等性:equals()、== 、 ===...类型检查 & 转换 包括:is、智能转换 和 as /** * 1. is * 作用:判断一个对象与指定的类型是否一致 **/ // 判断变量a的数据类型是否是String var a: Any...智能转换 * 说明: kotlin不必使用显式类型转换操作,因为编译器会跟踪不可变值的is检查以及显式转换,并在需要时自动插入(安全的)转换 **/ var a: Any = "a" if (a...智能转换不适用于 open 的属性或者具有自定义 getter 的属性; // 3. var 局部变量——如果变量在检查和使用之间没有修改、没有在会修改它的 lambda 中捕获、并且不是局部委托属性;...强制类型转换:as **/ var any: Any = "abc" var str: String = any as String // 强制类型转换是不安全的,若类型不兼容则会抛出一个异常 var

    98910

    Kotlin 1.2 的新增特性

    :运行 Kotlin 1.2.0 版本的 JVM 来自显式类型的信息被用于类型推断 Kotlin 编译器现在可以使用类型转换信息进行类型推断。...1.2.0 版本的 JVM 而且,现在允许在 lambda 中进行智能强制转换,这些局部变量只在 lambda 之前被修改: 6 目标平台:运行 Kotlin 1.2.0 版本的 JVM 支持 :...BigInteger 和 BigDecimal 的运算与转换 Kotlin 1.2 引入了一组用于操作 BigInteger 和 BigDecimal 以及使用从其他数字类型进行转换函数。...: 二元运算符 +, -, *, /, % 和中缀函数 and, or, xor, shl, shr 一元运算符 -, ++, -- 和一个函数 inv 浮点数转换 添加了新的函数用于将 Double...用于从位表示形式中转换为浮点数 Regex 类现在是可序列化的 kotlin.text.Regex 类已成为可序列化的类,现在可以在可序列化的层次结构中使用。

    2.8K70

    Kotlin 2.0 跟随全新的更快、更灵活的 K2 编译器一起发布

    虽然该语言本身没有引入新的语法,但 K2 编译器带来了一些优势,包括更快的构建、具有智能强制类型转换扩展语言功能,以及开箱即用的多平台支持。...这就是为什么 JetBrains 专注于扩展语言(语法)的功能来检查数据和描述条件,从而提高可读性和消除嵌套层的原因。此外,他说,智能强制类型转换可以减少认知负荷,因为你不需要学习新的结构。...animal.purr() } } 同样,智能强制类型转换将被传播,以保存有关可空性(nullability)、 is 检查、 as 强制类型转换和契约的状态。...当 Kotlin 2.0 应用新的智能强制类型转换时,另一种情况是将闭包内捕获的变量作为读 / 写。...Kotlin 将继续增强其控制流引擎,添加无需绑定的模式匹配、上下文敏感的解析、支持更智能强制类型转换的通用 ADT、效果系统等功能。

    21610

    你应该切换到Kotlin开发

    二、熟悉的语法 Kotlin不是学术界(编程界)奇怪的(令人难以捉摸的语言).来自于OOP(面向对象编程语言)界的程序员都很熟悉.并且或多或少的都可以去理解.当然与Java还是有一定的区别的.比如说构造函数...Kotlin编译器会跟踪您的逻辑做自动转换类型,这意味着不会有过多的instanceof检测(在明确的转换) if (obj is String) { print(obj.toUpperCase...= "xyz" b = null // no problem 当你访问一个空的变量的时候,Kotlin强制的避免NPES(NullPointerException)...val x = b.length // compile error: b might be null 虽然这个看起来有点繁琐,但是因为他的这些功能真的可以是开发轻松起来,并且我们可以智能转换...: "unknown" 如果这样并不适用于你,而且你需要一个NPE,你将不得不明确地要求它 val x = b?.length ?

    47800

    Kotlin 1.2 的新增了哪些特性?

    called on "abacaba": 4 called on [1, 2, 3, 1, 2]: 2 目标平台:运行 Kotlin 1.2.0 版本的 JVM 而且,现在允许在 lambda 中进行智能强制转换...1.2.0 版本的 JVM fill, replaceAll, shuffle/shuffled 添加了一系列扩展函数用于处理列表:针对 MutableList 的 fill, replaceAll...BigInteger 和 BigDecimal 的运算与转换 Kotlin 1.2 引入了一组用于操作 BigInteger 和 BigDecimal 以及使用从其他数字类型进行转换函数。...: 二元运算符 +, -, *, /, % 和中缀函数 and, or, xor, shl, shr 一元运算符 -, ++, -- 和一个函数 inv 浮点数转换 添加了新的函数用于将 Double...用于从位表示形式中转换为浮点数 Regex 类现在是可序列化的 kotlin.text.Regex 类已成为可序列化的类,现在可以在可序列化的层次结构中使用。

    2.8K10

    Android:这是一份全面 & 详细的Kotlin入门学习指南

    智能转换 * 说明: kotlin不必使用显式类型转换操作,因为编译器会跟踪不可变值的is检查以及显式转换,并在需要时自动插入(安全的)转换 **/ var a: Any = "a" if (a...is String) { print(a.length) } // 在 && 和 || 的右侧也可以智能转换: // `&&` 右侧的 a 自动转换为String if (a is String &...& a.length > 0) // `||` 右侧的 a 自动转换为String if (a is String || a.length > 0) // 在when表达式和while循环里也能智能转换...智能转换不适用于 open 的属性或者具有自定义 getter 的属性; // 3. var 局部变量——如果变量在检查和使用之间没有修改、没有在会修改它的 lambda 中捕获、并且不是局部委托属性;...强制类型转换:as **/ var any: Any = "abc" var str: String = any as String // 强制类型转换是不安全的,若类型不兼容则会抛出一个异常 var

    2.8K20

    Carson带你学Android:这是一份全面 & 详细的Kotlin入门学习指南

    智能转换 * 说明: kotlin不必使用显式类型转换操作,因为编译器会跟踪不可变值的is检查以及显式转换,并在需要时自动插入(安全的)转换 **/ var a: Any = "a" if (a...is String) { print(a.length) } // 在 && 和 || 的右侧也可以智能转换: // `&&` 右侧的 a 自动转换为String if (a is String &...& a.length > 0) // `||` 右侧的 a 自动转换为String if (a is String || a.length > 0) // 在when表达式和while循环里也能智能转换...智能转换不适用于 open 的属性或者具有自定义 getter 的属性; // 3. var 局部变量——如果变量在检查和使用之间没有修改、没有在会修改它的 lambda 中捕获、并且不是局部委托属性;...强制类型转换:as **/ var any: Any = "abc" var str: String = any as String // 强制类型转换是不安全的,若类型不兼容则会抛出一个异常 var

    2.2K20

    Spring认证中国教育管理中心-Spring Data MongoDB教程十五

    为了让你强制基础设施注册一个转换器,只有一个办法,我们提供@ReadingConverter并@WritingConverter在转换器实现使用注解。...(Kotlin 允许使用具有可为空值的函数式构造。请参阅Kotlin 空值安全性综合指南。)...20.3.对象映射 有关Kotlin对象如何具体化的详细信息,请参阅Kotlin 支持。 20.4.扩展 Kotlin扩展提供了使用附加功能扩展现有类的能力。...Kotlin 的类型安全查询 的协程扩展ReactiveFluentMongoOperations。 20.5.协程 Kotlin协程是轻量级线程,允许强制编写非阻塞代码。...,有限流或无限流,主要区别如下: Flow是基于推的,Flux而是推拉混合的 背压是通过挂起函数实现的 Flow只有一个挂起collect方法,操作符作为扩展实现 由于协程,运算符易于实现 扩展允许添加自定义运算符

    2.3K30

    微信团队分享:Kotlin渐被认可,Android版微信的技术尝鲜之旅1、引言2、概述3、“烹饪”准备4、“烹饪”过程5、开锅,上菜6、如何更好地了解Kotlin这种食材的味道附录:QQ、微信团队原创

    Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发(也就是开发了号称Java界最智能的集成开发工具IntelliJ IDEA的公司)。...2、概述 微信订阅号助手的Android App项目首次尝试使用Kotlin进行大规模的业务开发(483个Kt文件,3.8W行不包含空行的Kt代码),一开始接触Kotlin的时候难免会有点不适应,但经过几天的强制使用后...5.2 特色风味二:鲜 扩展函数,味道鲜美,百吃不厌。...使用Kotlin扩展函数就能有效避免前面所说的问题,接手项目的新人只需要轻轻的“.”一下,滚两下鼠标,"toIntSafely"的方法就会看到。...这就为什么你看Kotlin的Java扩展库很多都是通过扩展函数来封装; 2)方法的类归属更好理解:以上述的"toIntSafely"为例,String.toIntSafely,使得开发者更容易直观感受到这个函数用于

    48150

    Kotlin 基础 | 拒绝语法噪音

    扩展函数 扩展函数是一个类的成员函数,但它定义在类体外面。这样定义的好处是,可以在任何时候任何地方给类添加功能。...它们的共同点是适用于 “对同一个对象做多次操作” 的场景 。它们的不同点总结如下: ? kotlin中,发起调用扩展函数的那个对象,叫接收者对象。...插件,就不需要findViewById()) as保留字用于类型强制转换。...as保留字用于类型强制转换kotlin 中类型是后置的,在变量名或函数参数列表后跟上: 类型就可以显示指定类型。 :还用于继承类(取代extends)、实现接口(取代implements)。...kotlin 使用扩展函数,可以在类体外给类新增方法。 kotlin 预定了很多扩展函数,其中有一类适用于“对同一个对象做多次操作”。包括also()、apply()、let()、with()。

    1.1K30

    Android平台的Swift—Kotlin

    类型智能转换:通过is进行类型判断后,编译器自动进行类型转换。父类引用可以调用子类接口,注意转换只在is的代码块中生效。...但是这里要注意一点,如果从Java返回的集合,不会强制做可空检查,这个是时候如果给不可空引用赋值Java集合中的null会出现转换错误异常。...2、扩展函数 跟OC的Category一样,可以对API的函数进行扩展。...[20.png] 我们在任意Activity中都可以直接调用 [21.png] 函数扩展并不是修改了原来的类,通过反编译成Java代码可以发现,函数扩展是通过静态导入的方式实现的。...Kotlin用于JavaScript: 使用kotlinc-js编译器将Kotlin代码转换为JavaScript(不是Kotlin或标准库的代码编译时会被忽略),Kotlin中提供了一些标准库用于JS

    3.5K90

    是时候使用Kotlin编程了

    并且,Kotlin还提供了智能的类型判断功能,使用is类型判断后,编译器自动进行类型转换,父类引用可以调用子类接口,注意转换只在is的代码块中生效。...但是这里要注意一点,如果从Java返回的集合,不会强制做可空检查,这个是时候如果给不可空引用赋值Java集合中的null会出现转换错误异常。...2,扩展函数 跟OC的Category一样,Kotlin也支持对API函数进行扩展。 然后,我们可以在任意Activity中直接调用。...3,Kotlin用于JavaScript 使用kotlinc-js编译器将Kotlin代码转换为JavaScript(不是Kotlin或标准库的代码编译时会被忽略),Kotlin中提供了一些标准库用于JS...5.2 继承 5.3 抽象类 5.4 接口 5.5 小结 第6章 扩展函数与属性 6.1 枚举 6.1.1 基本用法 6.1.2 枚举类扩展 6.2 扩展 6.2.1 扩展的动机 6.2.2 扩展原生函数

    3.2K10

    Kotlin 与 Java 对比Kotlin 开发者社区

    Kotlin 解决了一些 Java 中的问题: Kotlin 通过以下措施修复了 Java 中一系列长期困扰我们的问题 空引用由类型系统控制。...无原始类型 Kotlin 中数组是不型变的 相对于 Java 的 SAM-转换Kotlin 有更合适的函数类型 没有通配符的使用处型变 Kotlin 没有受检异常 Java 有而 Kotlin 没有的东西...受检异常 不是类的原生类型 静态成员 非私有化字段 通配符类型 Kotlin 有而 Java 没有的东西 Lambda 表达式 + 内联函数 = 高性能自定义控制结构 扩展函数 空安全 智能类型转换...字符串模板 属性 主构造函数 一等公民的委托 变量和属性类型的类型推断 单例 声明处型变 & 类型投影 区间表达式 操作符重载 伴生对象 数据类 分离用于只读和可变集合的接口 协程

    53020

    kotlin相比于java的好处和坏处_kotlin和java

    主要区别: Kotlin 结合了面向对象和函数式编程的特性,而 Java 仅限于面向对象编程。 Kotlin 允许用户创建扩展函数,而 Java 不提供任何扩展函数。...Kotlin 和 Java 的区别 Kotlin 与 Java 这是 Kotlin 与 Java 之间的区别 Kotlin Java Kotlin 允许用户创建扩展函数。...Java 不提供任何扩展功能。 Kotlin 不需要为数据类做太多工作。 Java 开发人员编写和构造了很多元素来开发类 Kotlin 不提供隐式转换。 Java 支持隐式转换。...Kotlin 程序不需要在其程序中使用分号。 Java 程序确实需要一个分号。 在 Kotlin 中,协程是并发设计模式,可用于简化代码。...Kotlin 中提供了智能转换功能。 Java 中不提供智能转换功能。 Kotlin 不需要任何变量数据类型规范 Java 需要可变数据类型规范。 Kotlin 支持 Lambda 表达式。

    6.5K10
    领券