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

Kotlin和泛型委托,如何在子类之间切换

Kotlin是一种现代化的静态类型编程语言,它在Android开发中得到了广泛应用。泛型委托是Kotlin中的一种特性,它允许我们在不同的类之间共享相同的行为和属性。

在Kotlin中,我们可以使用泛型委托来实现子类之间的切换。具体而言,我们可以定义一个接口或抽象类,然后在子类中使用委托将其实现或继承给其他子类。这样,我们就可以在不改变子类继承关系的情况下,动态地切换子类的行为。

下面是一个示例:

代码语言:txt
复制
interface Switchable {
    fun switch()
}

class SubclassA : Switchable {
    override fun switch() {
        println("Switching behavior in Subclass A")
    }
}

class SubclassB(private val delegate: Switchable) : Switchable by delegate {
    override fun switch() {
        println("Switching behavior in Subclass B")
    }
}

fun main() {
    val subclassA = SubclassA()
    val subclassB = SubclassB(subclassA)

    subclassA.switch() // 输出:Switching behavior in Subclass A
    subclassB.switch() // 输出:Switching behavior in Subclass B
}

在上面的示例中,我们定义了一个Switchable接口,其中包含一个switch方法。然后,我们创建了SubclassASubclassB两个子类,它们都实现了Switchable接口。

SubclassB中,我们使用了委托by关键字将Switchable接口的实现委托给了delegate对象。这样,当我们调用SubclassBswitch方法时,实际上是调用了delegate对象的switch方法。

main函数中,我们创建了SubclassASubclassB的实例,并分别调用它们的switch方法。可以看到,SubclassASubclassB的行为是不同的,但它们都可以通过委托实现共享的行为。

这种子类之间的切换可以在各种场景中使用,特别是当我们需要在不同的子类之间动态切换行为时。例如,在一个游戏中,我们可以定义不同的角色类,并使用泛型委托来切换它们的技能或行动。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体的产品选择应根据实际需求进行评估和决策。

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

相关·内容

当类的相关时,如何在两个之间创建类似子类型的关系呢

那么问题来了,当类的相关时,如何在两个之间创建类似子类型的关系呢?例如如何让Box Box变得与Box有关呢?...小结:可以通过继承类或者实现接口来对其进行子类型化。 搞懂了子类型化的问题,我们回到“如何在两个之间创建类似子类型的关系“的问题。...类或者接口并不会仅仅因为它们的类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建类或接口之间的关系。...extends Number> 因为Integer是Number的子类型,numberBox的是Number对象子类,所以在intBoxnumberBox之间存在关系。...图为用上限下限通配符声明的几个类之间的关系。

2.8K20

Kotlin 1.4-M1 现已发布!

: 在 Kotlin 1.3 中,您需要引入显式 lambda 参数,或者将 to 替换为包含显式参数的 Pair 构造函数才可以。...Kotlin/Native 默认支持 Objective-C 历史版本的 Kotlin 在 Objective-C 互操作中为提供了实验性支持。...要从 Kotlin 代码使用生成框架标头,您过去必须使用 -Xobjc-generics 编译器选项。在 1.4-M1 中,此行为已成为默认行为。...在一些情况下,这可能会破坏调用 Kotlin 框架的现有 Objective-C 或 Swift 代码。要不使用编写框架标头,请添加 -Xno-objc-generics 编译器选项。...Kotlin Swift 之间的错误处理存在着根本的区别。所有 Kotlin 异常都未经检查,而 Swift 只包含检查的错误。

3.4K20

【Android进阶】Kotlin笔记

Sealed Class 密封类 如果想对能够创建出的子类做限制,可以使用密封类。...Kotlin默认支持委托,不像Java,要么用IDE生成一大堆代码,要么在编译期使用其他动态代理工具生成,Kotlin默认提供了by关键字。...ASDFASDF */ 被委托的类应该实现一个getValuesetValue方法,委托方的变量不再存储值,而是由被委托的类提供存储功能。...然后,我们还运用了lambda表达式,lambda用于返回一个值,一般使用懒加载的时候,这个lambda表达式都会是一个很复杂并且可能并不常用的运算,所以这样如果这个值如果没被需要,懒加载就不会执行...用于支持全部类型的值。 伴生对象 Java中经常会使用静态工厂方法来构造对象,这是因为静态工厂方法比构造器更加适用于处理那些很多属性可以不在构造时提供的类。静态工厂方法更加具有可读性。

67920

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

`的子类型 。 在 Kotlin 中,类类型之间有一定的对应关系,但并不完全相同。...在 Java 中,我们常见的有:类、接口、方法属性,Kotlin 系统继承了 Java 系统,同时添加了一些强化的地方。...中竟然能将List赋值给List,不是说好的KotlinJava的原理是一样的吗?...如果在定义的方法的参数前面加上out关键词,说明这个类及方法是协变,简单来说类型A是类型B的子类型,那么Generic也是Generic的子类型, !...Derived 兼容父类型 Base •生产者 Producer #### 逆变: 反转子类型化关系 如果在定义的方法的参数前面加上

40750

是时候使用Kotlin编程了

3,完全兼容Java Kotlin的另一个优势就是可以100%的兼容Java,KotlinJava之间可以相互调用。...2, 的存在主要是为了消除模板代码类型转换安全, 在Kotlin的使用基本与Java是一致的。...在Java中是不变的,比如:虽然A继承B,但ListList之间没有任何关系,Java是通过通配符来实现变的: 3,反射 反射是运行于JVM中的程序检测修改运行时的一种行为,通过反射可以在运行时获取对象的属性方法...8.1集合 8.1.1 集 8.1.2 列表 8.1.3 映射 8.2 8.2.1 基础 8.2.2 变 8.2.3 声明处变 8.2.4 类型投影 8.2.5 星号投影 8.2.6 型函数...8.2.7 约束 8.3 小结 第9章 对象与委托 9.1 对象 9.1.1 对象表达式 9.1.2 对象申明 9.1.3 伴生对象 9.2 委托 9.2.1 类委托 9.2.2 委托属性 9.3

3.2K10

Kotlin学习笔记(七)-

其实KotlinJava很相似。他们都是伪,所谓伪就是我们们是无法获取到的具体的类型的。以为Java存在类型擦除转换。...本篇还是反射一样,从实际代码编写角度,说下Kotlin 逆变与协变 的逆变与协变其其在Java中也有。简单概括来说就是实现了的协变,<?...Kotlin中的协变与逆变 参数即可作为传入的参数,也可以作为返回值,但被inout关键字修饰后就不一样了 out 叫协变 只能作为返回值读取 不能写入修改(Kotlin的list中只有get方法...,为只读类型, 它的子类参数的类型是父类的参数类型的子类,也就是说参数的继承关系与类的继承关系保持一致(所以叫协变),比如Number是Int的父类 那么List也是List...它的参数的继承关系与类的继承关系相反,比如父类是Any,子类是Int。

63520

你应该知道的kotlin实用技巧

中的实化关键字,使抽象的东西更加具体或真实。...Intent(context, T::class.java)) } // Caller startActivity(context) 使用 reified,通过添加类型传递简化参数...这样就不用手动传的类型过去了 Gson解析例子 我们首先看下一般我们使用gson解析json是怎么做的 在Java序列化库(Gson)中,当您想要反序列化该JSON字符串时,您最终必须将...在Kotlin1.4之前,Kotlin是不支持Kotlin的SAM转换的,只支持Java SAM转换,官方给出的的解释是:是 Kotlin 本身已经有了函数类型高阶函数,不需要在去SAM转化。...这个解释开发者并不买账,如果你用过Java LambdaFuction Interface。当你切换Kotlin时,就会很懵逼。

1.5K10

Effective Kotlin 译文:Chapter3-Item24-

更多关于的内容可参见我的另一篇文章:《一文了解 Java/Kotlin 中的》 条目 24:关注变 名词解释表 英文 中文 解释 type parameter 类型参数 中尖括号中的参数...,例如 List 中的 T,Comparable 中的 Int 等 variance modifiers 变修饰符 in out - 子类 标准翻译应为:类型参数为子类,...,为了方便理解记忆,在此列出名词对照表 假设我们有以下类: class Cup 上述类的类型参数 T 没有指定任何变修饰符(in 或者 out), 因此默认是不变的。...不变意味着子类父类之间没有任何继承关系,比如:Cup Cup、Cup Cup 之间没有任何继承关系。...: Array) { val b: Cup = Cup() // 协变之后,子类是父类子类子类可以赋值给父类 } class Cup

57710

转向Kotlin——

基础 在了解Kotlin之前,先来看看Java中的: 举个栗子:在JDK中,有一类列表对象,这些对象对应的类都实现了List接口。...,不过在Kotlin中,没有通配符。...KotlinKotlin并没有提供通配符,取而代之的是outin关键字。用out声明的占位符只能在获取类型值得地方,函数的返回值。...用in声明的占位符只能在设置类型值的地方,函数的参数。 我们习惯将只能读取的对象称为生产者,将只能设置的对象称为消费者。...小结 Kotlin是在Java的基础上进行了改进,变得更好用,更安全,尽管上述的技术不一定都用得上,但对于全面了解Kotlin会起到很大作用。

91220

你应该知道的kotlin实用技巧

中的实化关键字,使抽象的东西更加具体或真实。...Intent(context, T::class.java)) } // Caller startActivity(context) 使用 reified,通过添加类型传递简化参数...这样就不用手动传的类型过去了 Gson解析例子 我们首先看下一般我们使用gson解析json是怎么做的 在Java序列化库(Gson)中,当您想要反序列化该JSON字符串时,您最终必须将Class...在Kotlin1.4之前,Kotlin是不支持Kotlin的SAM转换的,只支持Java SAM转换,官方给出的的解释是:是 Kotlin 本身已经有了函数类型高阶函数,不需要在去SAM转化。...这个解释开发者并不买账,如果你用过Java LambdaFuction Interface。当你切换Kotlin时,就会很懵逼。

1.4K00

阿里云大神亲码“Kotlin深度笔记”,不讲一句废话,全是精华

基本类型、包、控制流、返回与跳转 image.png 3.类对象 主要内容:类继承、属性字段、接口、可见性修饰词、扩展、数据对象、、嵌套类、枚举类、对象表达式和声明、代理模式、代理属性 4.函数...(B,C) -> D HTML Kotlin DSL 实战 image.png Kotlin 遥控器的故事: 招聘的故事:的不变性(Invariant) 搞定招聘:的协变(Covariant...) 填志愿的故事:的逆变(Contravariant) 使用处变(Use-site Variance) Kotlin 实战 Kotlin 扩展 扩展是什么?...类内扩展 (Declaring extensions as members) 扩展函数 + SharedPreferences 扩展函数 + Spannable Kotlin 委托 委托类(Class...Delegation) 委托属性(Property Delegation) 自定义委托属性 委托属性 + SharedPreferences 协程“不为人知”的调试技巧 协程 JVM 参数 Kotlin

1.1K10

Kotlin变之路

通用类型:T,S,U,V 集合元素类型:E 映射键-值类型:K,V 数值类型:N 要理解Kotlin,我们最好首先从Java的来学习,毕竟Kotlin的语法糖太多了,Java会更加白话文一点...Kotlin让我们有了可以支持多种类型的能力,变让我们有了修改的能力,总结来说: 通配符<?...Kotlin官网上有个著名的——Consumer in, Producer out,说的就是这个意思。 Kotlin的优化 我们通过这个例子来看下Kotlin对Java的改进。...是Java的子类,但是ListList却是两个无关的类,它们之间没有继承关系,而使用List后,相当于ListList之间也有了继承关系,从而可以读取List中不同类型的数据,List就是通过这种方式来实现了集合的多态。

1.2K21

Kotlin委托属性区间

在这种情况下,委托可以直到该变量在方法内部声明的时候才去初始化,而不必在构造函数中就执行初始化。 委托 委托方法也可以被声明成的,这样一来不同类型的属性就可以复用同一个委托类了。...private var maxDelay: Long by SharedPreferencesDelegate() 然而,如果像上例那样对基本类型使用委托的话,即便声明的基本类型非空,也会在每次读写属性的时候触发装箱拆箱的操作...说明:对于非空基本类型的委托属性来说,最好使用给定类型的特定委托类而不是委托来避免每次访问属性时增加装箱的额外开销。...标准委托:lazy() 针对常见情形,Kotlin 提供了一些标准委托 Delegates.notNull()、 Delegates.observable() lazy()。...然而,如果在声明使用之间有至少一次间接调用的话,range 会有一些微小的额外开销。

1.3K70

Kotlin开发笔记之委托属性与区间(译)

在这种情况下,委托可以直到该变量在方法内部声明的时候才去初始化,而不必在构造函数中就执行初始化。 委托 委托方法也可以被声明成的,这样一来不同类型的属性就可以复用同一个委托类了。...private var maxDelay: Long by SharedPreferencesDelegate<Long () 然而,如果像上例那样对基本类型使用委托的话,即便声明的基本类型非空,也会在每次读写属性的时候触发装箱拆箱的操作...说明:对于非空基本类型的委托属性来说,最好使用给定类型的特定委托类而不是委托来避免每次访问属性时增加装箱的额外开销。...标准委托:lazy() 针对常见情形,Kotlin 提供了一些标准委托 Delegates.notNull() 、 Delegates.observable() lazy() 。...然而,如果在声明使用之间有至少一次间接调用的话,range 会有一些微小的额外开销。

64710

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

, 需要在 fun 关键字 函数名 之间 , 使用 尖括号 注明 ; 代码示例 : 在本代码中 , logT 函数涉及到了两个参数 , 传入的 匿名函数 参数类型为 (T) -> R... 函数名 之间 , 使用 尖括号 注明 新的参数 ; class Student(_item: T) { var item: T = _item fun logT...return action(item) } 在 尖括号 中声明 参数 时 , 可以指定 类型 的 约束 , 类型 必须是某个类型的子类 ; 在下面的代码中 , Soldier...子类对象 , ( 反之就会报错 ) 如果 使用 out 关键字 , 则 范围小的子类对象 赋值给 范围大的 父类对象 ; ( 反之就会报错 ) 使用了 out 协变 in...> 子类 , Producer 的参数 FastFood 是 Food 的子类 , 在 Kotlin 中 , 可以将 Producer 类型赋值给 Producer

3.6K10

一文了解 JavaKotlin 中的

阅读本文你将了解:什么是变、协变、逆变变在 Java Kotlin 中如何实现以上变Java Kotlin的异同在 Java/Kotlin 中,子类对象是可以赋值给一个父类类型的...,比如 List 中的 String 就是类型参数,普通参数不同,类型参数传递的是一个类型而不是对象为了描述方便,以下把所有「类型参数为子类」简称为「子类」,「类型参数为父类的...,可以把父类赋值给子类变(Invariant):子类父类没有任何继关系,也不可以相互赋值说的是偏概念的描述,听起来特别绕,特别反人类,用代码来说人话就是(已知 Dog 是 Animal...,父类不可以赋值给子类,再结合类型的上限下限,自然可以推导出到底什么时候可以编译通过了更多关于变特性背后的设计原因,请参见我的另一篇文章:Effective Kotlin 译文:Chapter3...,这样类型也就更加安全了,因此我说 —— Kotlin Java 的加强版在介绍其他 Kotlin 的 “加强功能” 之前,我们先了解一下: Java 上的变,到 Kotlin 之后如何实现表示

86420

Kotlin Vocabulary | 揭秘协程中的 suspend 修饰符

Kotlin 协程把 suspend 修饰符引入到了我们 Android 开发者的日常开发中。您是否好奇它的底层工作原理呢?编译器是如何转换我们的代码,使其能够挂起恢复协程操作的呢?...作为开发者,您可以把挂起函数看作是普通函数,只不过它可能会在某些时刻挂起恢复而已。 不同于回调,协程提供了一种简单的方式来实现线程间的切换以及对异常的处理。...Continuation 其实只是一个具有参数一些额外信息的回调接口,稍后我们会看到,它会实例化挂起函数所生成的状态机。...编译器会使用同一个 Continuation 对象在方法中共享信息,这也是为什么 Continuation 的参数是 Any,而不是原函数的返回类型 (即 User)。...此时,编译器只需要添加如何在状态之间切换的信息。 首先需要知道的是: 函数是第一次被调用; 函数已经从前一个状态中恢复。

2.1K10
领券