范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Kotlin笔记(内联类)

  内联类
  有时,业务逻辑需要围绕某种类型创建包装器。但是,由于额外的堆分配,它会引入运行时开销。此外,如果包装类型是原始类型,则性能损失很糟糕,因为原始类型通常由运行时进行大量优化,而它们的包装器没有得到任何特殊处理。为了解决这些问题,Kotlin 引入了一种特殊的类,称为 内联类 。要声明内联类,请在类名前使用value修饰符( inline内联类的修饰符已弃用): value class Password(private val s: String)
  要为JVM后端声明内联类,请在类声明之前使用value修饰符和@JvmInline注释: // For JVM backends @JvmInline value class Password(private val s: String)
  内联类必须具有在主构造函数中初始化的单个属性。在运行时,内联类的实例将使用这个单一属性表示(请参阅 下面有关运行时表示的详细信息): // No actual instantiation of class "Password" happens // At runtime "securePassword" contains just "String" val securePassword = Password("Don"t try this in production")
  这是内联类的主要特征:类的数据被 内联 到使用它的地方。 内联类的成员
  内联类支持常规类的一些功能。内联类中可以声明属性和函数,并具有以下init块: @JvmInline value class Name(val s: String) {     init {         require(s.length > 0) { }     }      val length: Int         get() = s.length      fun greet() {         println("Hello, $s")     } }  fun main() {     val name = Name("Kotlin")     name.greet() // method `greet` is called as a static method     println(name.length) // property getter is called as a static method }
  内联类的属性不能拥有 backing fields, 内联类只能拥有简单的计算属性 (不能拥有延迟初始化属性或委托属性)。 内联类成的继承interface Printable {     fun prettyPrint(): String }  @JvmInline value class Name(val s: String) : Printable {     override fun prettyPrint(): String = "Let"s $s!" }  fun main() {     val name = Name("Kotlin")     println(name.prettyPrint()) // Still called as a static method }内联类只允许继承接口  内联类不能继承其他类 内联类是 final 类, 不能被其他类继承 内联类的表示
  在生成的代码中,Kotlin 编译器为每个内联类保留一个 包装器。 内联类实例可以在运行时表示为包装器或底层类型。 类似于Int可以表达为基本类型int, 也可以表达为包装类Integer。 Kotlin编译器更喜欢使用底层类型而不是包装器来生成最高性能和优化的代码。但是,有时需要保留包装器。根据经验,内联类在用作另一种类型时都会被装箱。 interface I  @JvmInline value class Foo(val i: Int) : I  fun asInline(f: Foo) {} fun  asGeneric(x: T) {} fun asInterface(i: I) {} fun asNullable(i: Foo?) {}  fun  id(x: T): T = x  fun main() {     val f = Foo(42)      asInline(f)    // unboxed: used as Foo itself     asGeneric(f)   // boxed: used as generic type T     asInterface(f) // boxed: used as type I     asNullable(f)  // boxed: used as Foo?, which is different from Foo      // below, "f" first is boxed (while being passed to "id") and then unboxed (when returned from "id")     // In the end, "c" contains unboxed representation (just "42"), as "f"     val c = id(f) }
  因为内联类既可以表示为基础值,也可以表示为包装器,因此 引用相等对它们没有意义,因此被禁止。 内联类中的函数名称混淆
  由于内联类被编译为它们的底层类型,它可能会导致各种模糊的错误,例如意外的平台签名冲突: @JvmInline value class UInt(val x: Int)  // Represented as "public final void compute(int x)" on the JVM fun compute(x: Int) { }  // Also represented as "public final void compute(int x)" on the JVM! fun compute(x: UInt) { }
  为了解决这种问题,使用内联类的函数会通过在函数名称中添加一些稳定的哈希码来 破坏 。因此,fun compute(x: UInt)将表示为public final void compute-(int x),从而解决了冲突问题。 从 Java 代码调用
  您可以从Java代码调用接受内联类的函数。为此,您应该手动禁用混淆:在函数声明之前添加注解@JvmName: @JvmInline value class UInt(val x: Int)  fun compute(x: Int) { }  @JvmName("computeUInt") fun compute(x: UInt) { }内联类与类型别名
  乍一看,内联类似乎与类型别名非常相似。实际上,两者似乎都引入了一种新类型,并且两者都将在运行时表示为底层类型。然而,关键的区别在于类型别名与其底层类型(以及具有相同底层类型的其他类型别名) 赋值兼容,而内联类则不然。 换句话说,内联类引入了一种真正的 新 类型,与类型别名相反,类型别名只为现有类型引入替代名称(别名): typealias NameTypeAlias = String  @JvmInline value class NameInlineClass(val s: String)  fun acceptString(s: String) {} fun acceptNameTypeAlias(n: NameTypeAlias) {} fun acceptNameInlineClass(p: NameInlineClass) {}  fun main() {     val nameAlias: NameTypeAlias = ""     val nameInlineClass: NameInlineClass = NameInlineClass("")     val string: String = ""      acceptString(nameAlias) // OK: pass alias instead of underlying type     acceptString(nameInlineClass) // Not OK: can"t pass inline class instead of underlying type      // And vice versa:     acceptNameTypeAlias(string) // OK: pass underlying type instead of alias     acceptNameInlineClass(string) // Not OK: can"t pass underlying type instead of inline class }

宅家大跳刘畊宏毽子舞,用极米Z6XPro陪练更酣爽一首周董经典的本草纲目,洗脑了刘畊宏男孩女孩们一套活力满满的健身操,累趴了全网的小仙女健身狂热爱好者刘畊宏于社交平台中带领网友进行居家健身操,疾速火遍全网。在刘畊宏晒出自己使用极米小米MIXFOLD2惊艳外观亮相,小米12价格发烧惨遭疯抢据5月16日消息,今日微博博主数码聊天站据悉曾表示,小米MIXFOLD2二代折叠机整体非常轻薄,仅比一侧的充电口厚一点,并支持杜比视界视频。这就是为什么这款手机不支持无线充电的原因时代霸主微软总裁比尔盖茨全球个人电脑软件领导品牌微软公司的董事长兼CEO。比尔盖茨出生于1955年10月28日,和二位姐妹一同在西雅图成长。父亲是一位律师,已去世的母亲则是位集学校老师华盛顿大学董事长和U科技创新是未来进步的关键1科技创新的意义科学技术是第一生产力,这句话充分阐释了科学技术对一个国家和一个民族的重要性。中国历来都十分重视科技的发展与创新。创新是一个民族进步的灵魂,是国家文明发展的不竭动力,刚刚!国际大行突然翻多,大幅上调腾讯阿里美团等目标价,最高翻倍!更有旗舰基金10倍增持,释放什么信号?点蓝字关注,不迷路在3月大幅下调相关评级后,国际大行摩根大通突然全面翻多,上调大部分中资互联网公司评级。5月16日,据彭博社消息,摩根大通今日集体上调多家互联网公司评级,对腾讯控股知网涉嫌垄断被立案调查海康威视回应被美制裁传言AI周报马斯克收购Twitter的交易暂时搁置前小米VR负责人已加入字节跳动钉钉被曝组织优化,涉及自研SaaS硬件部门中芯国际2022年第一季度营收18。4亿美元,同比增长66。9苹果更依魅族在新系统上的这波操作,简直太骚了前阵子珠海小厂魅族做了一个所有国产手机厂商都没做过的骚操作,可以说是狠狠收割了一波煤油们的好评,甚至连我这个小米用户也羡慕了。事情的起因是这样的。最近这两年安卓旗舰芯片功耗表现不尽华为真有35岁生死线吗?没有强制性,我以前部门好几个都过40了,其中有管理层,有技术专家,也有普通开发人员(这也有好几个,非SE)。早几年,绩效拿过C继续待很多年的也有,不过连续拿C就不行。这两三年因为美58同城安居客数智化升级满足多元居住需求助力用户实现理想安居在租购并举大背景下,房产行业迎来了新的发展模式,一方面商品房市场将更好满足购房者的合理住房需求,另一方面住房租赁行业的发展也在提速。作为国内领先的房产信息及交易服务平台,58同城安5月15日上市公司发布最新事项公告精选二)1川能动力(000155)公司股票5月16日开市时起开始停牌,预计停牌时间不超过10个交易日。公司拟收购四川省能投风电开发有限公司少数股权四川省能投会东新能源开发有限公司少数股权四可追踪并分析动物行为瑞士研究团队开发出人工智能图像算法据瑞士资讯网站近日报道,来自瑞士的研究团队开发出了一种利用人工智能追踪并分析动物行为的新方法。这项技术目前正在苏黎世动物园接受测试。机器能否察觉动物的喜怒哀乐?研究动物行为的科学家
智能电视安装软件无法识别U盘怎么办?沙发管家来解析U盘是为智能电视及网络机顶盒安装软件必备的工具,但是也经常会出现U盘插在智能设备上不识别的情况,那么针对小米盒子增强版出现这类情况有哪些原因呢?又该如何解决?1通常情况下,首先需要沙发管家安装APK时提示解析包出现错误怎么解决?最近常常有用户问小编,安装apk文件的时候电视显示解析包出现错误是为什么?今天小编搜集了一些相关资料统一给大家说下,安装apk文件时发生解析包出现错误的几大问题和解决方法。原因一a沙发管家电视选购解惑HDMI2。1真的是刚需吗?如今电视产品和技术的升级似乎已经远远超出了普通人的需求范围,甚至在一定程度上引领着大众的消费观。从1080P到4K的全面普及,仅仅用了两年时间,8K内容建设更是箭在弦上。在硬件军备沙发管家智能电视卡顿的四种常见情况及解决方案看智能电视最怕遇到的就是卡顿。画面突然顿住,开始转圈圈,让很多用户既气愤又无奈。其实智能电视的卡顿问题,有多方面的原因。本文梳理出几个常见原因及解决办法,希望能帮助到大家。1网络不同为180匹上下的功率,为何宝马3系动力充沛而Es200却很肉?要知道宝马3系有184匹马力的版本而雷克萨斯Es200的功率为174匹马力,两款车的功率差异只有区区10匹,为何宝马3系开起来动力充沛而Es200给人的感觉却很肉呢?仅仅10匹的动汽车上隐藏了哪些我们平时很难发现,却又无比精妙的安全设计?汽车虽然已经普及了很多年,不过汽车上的一些设计依然是精妙无比虽然这些设计我们平时很少会用到,甚至我们在日常用车中都不会注意到车子上精妙的设计,所以很多车友对于当代汽车也仅仅是停留在分时四驱全时四驱适时四驱有哪些不同,应该如何去进行区分?相信广大车友对四轮驱动并不陌生,毕竟现如今绝大多数SUV都有四驱版本因为燃油经济性的标准越来越严格,所以路面上的适时四驱车型越来越多,而分时四驱全时四驱车型则正在变少,那么这三种四长城炮携炮火联盟阿拉善集结,把够野打在公屏上在过去上学的时候,我最头疼的就是每天的作业,写了半天都写不完,那时候我总幻想着长大后的生活,大人的世界一定充满了乐趣,既没有作业,老师也不会天天管你,这简直是天堂般的生活。而长大以知识小科普你了解WPS按钮的用处吗?说到路由器大家都很熟悉,那路由器上的WPS按钮你们都知道吗?这个按钮到底有什么用呢?今天小编就来给各位说说。路由器中的WPS是WiFiProtectedSetup的简称,中文翻译为动能回收系统并不能替代刹车,浅谈特斯拉的制动为何饱受争议?随着温州特斯拉刹车失灵事故的反转,也让我们知道了慌乱中把油门当刹车有多么的可怕实际上从这个因刹车导致的事故刚出现时,鄙人就感觉是驾驶习惯的问题只不过那时候被一些不理性且主观情绪过浓全国首个支持L4的车型将现世?长城汽车智慧线控底盘助攻不同于老一辈对汽车的基本需求,新时代的消费者对座驾提出了更高的要求,颜值高空间大是基础,最重要还是要懂人心,能够根据车主的想法办事。那么这样的座驾哪里找呢?长城汽车咖啡智能2。0智