快速上手kotlin接口抽象类及泛型(代码片段)

super码王 super码王     2022-11-28     146

关键词:

接口定义

        kotlin规定所有的接口属性和函数实现都要使用 override 关键字,接口中定义的函数并不需要open关键字修饰,他们默认就是open的

代码展示:

package com.wustyq.kotlinstudy

interface Movable 
    var maxSpeed: Int
    var wheels: Int

    fun move(movable: Movable): String


class Car(name: String, override var wheels: Int = 4) : Movable 
    override var maxSpeed: Int
        get() = TODO("Not yet implemented")
        set(value) 

    override fun move(movable: Movable): String 
        TODO("Not yet implemented")
    
  • 接口里的属性和方法都得实现
  • 属性实现可以选择在构造方法里,也可以不在构造方法里,如果不在构造方法里,就得设置get和set方法

默认实现

        我们也可以在接口里提供默认属性的getter方法和函数实现

代码示例:

package com.wustyq.kotlinstudy

interface Movable 
    val maxSpeed: Int
        get() = (0..4).shuffled()
            .last()
    var wheels: Int

    fun move(movable: Movable): String


class Car(name: String, override var wheels: Int = 4) : Movable 
    override var maxSpeed: Int
        get() = super.maxSpeed
        set(value) 

    override fun move(movable: Movable): String 
        TODO("Not yet implemented")
    
  • 接口里属性修饰符是val,接口里属性必须提供get方法
  • 接口里属性修饰符是val,实现类可以是val 或 var,如果是val就不用set方法,如果是var,就得set和get一起

抽象类

        要定义一个抽象类,你需要在定义之前加上 abstract 关键字,除了具体的函数实现,抽象类也可以包含抽象函数---只有定义,没有函数实现。

代码示例:

package com.wustyq.kotlinstudy

abstract class Gun(val range: Int) 
    //抽象类里面既有具体实现方法
    protected fun doSomething() 
        println("doSomething")
    

    //也存在抽象方法,继承该抽象类的类要实现这个方法
    abstract fun pullTrigger(): String


class AK47(val price: Int) : Gun(range = 500) 
    override fun pullTrigger(): String 
        TODO("Not yet implemented")
    

定义泛型类型

 代码展示:

package com.wustyq.kotlinstudy

class MagicBox<T>(item: T) 
    private var subject: T = item


class Boy(val name: String, val age: Int)

class Dog(val weight: Int)

fun main() 
    val box1: MagicBox<Boy> = MagicBox(Boy("Jack", 20))
    val box2: MagicBox<Dog> = MagicBox(Dog(20))

泛型函数

代码展示: 

package com.wustyq.kotlinstudy

class MagicBox<T>(item: T) 
    var available = false
    private var subject: T = item

    fun fetch(): T? 
        return subject.takeIf  available 
    


class Boy(val name: String, val age: Int)

class Dog(val weight: Int)

fun main() 
    val box1: MagicBox<Boy> = MagicBox(Boy("Jack", 20))
    val box2: MagicBox<Dog> = MagicBox(Dog(20))
    box1.available = true
    println(box1.fetch()?.name)

效果展示:

多泛型参数

代码示例: 

package com.wustyq.kotlinstudy

import javax.security.auth.Subject

class MagicBox<T>(item: T) 
    var available = false
    private var subject: T = item

    fun fetch(): T? 
        return subject.takeIf  available 
    

    fun <R> fetch(subjectModFunction: (T) -> R): R? 
        return subjectModFunction(subject).takeIf  available 
    


class Boy(val name: String, val age: Int)

class Dog(val weight: Int)

fun main() 
    val box1: MagicBox<Boy> = MagicBox(Boy("Jack", 20))
    val box2: MagicBox<Dog> = MagicBox(Dog(20))
    box1.available = true
    println(box1.fetch()?.age)

    val boy3 = box1.fetch 
        Boy(it.name, it.age + 10)
    
    println(boy3?.age)

效果展示:

泛型类型约束

 代码示例: 

package com.wustyq.kotlinstudy

import javax.security.auth.Subject

class MagicBox<T : Human>(item: T) 
    var available = false
    private var subject: T = item

    fun fetch(): T? 
        return subject.takeIf  available 
    

    fun <R> fetch(subjectModFunction: (T) -> R): R? 
        return subjectModFunction(subject).takeIf  available 
    


open class Human(val age: Int)

class Boy(val name: String, age: Int) : Human(age)

class Dog(val weight: Int)

fun main() 
    val box1: MagicBox<Boy> = MagicBox(Boy("Jack", 20))
    val box2: MagicBox<Dog> = MagicBox(Dog(20))
    box1.available = true
    println(box1.fetch()?.age)

    val boy3 = box1.fetch 
        Boy(it.name, it.age + 10)
    
    println(boy3?.age)

 效果展示:

kotlin学习笔记——接口抽象类泛型扩展集合操作符与java互操作性单例(代码片段)

注:编码工具为IntelliJ目录接口示例定义变量示例变量默认值抽象类示例实现接口泛型泛型类泛型函数泛型实现自定义map变换泛型类联合泛型函数实现泛型函数实现类型约束泛型vararg参数vararg示例泛型vararg类型判断out和in关键... 查看详情

kotlin中接口抽象类泛型out(协变)in(逆变)reified关键字的详解(代码片段)

...xff0c;忍不住也分享一下给大家👉点击跳转到教程一、Kotlin中接口的定义Kotlin中接口定义Kotlin规定所有的接口属性和函数实现都要使用override关键字,接口中定义的函数并不需要open关键字修饰,它们默认就是open的。/***... 查看详情

快速上手kotlin开发系列之集合操作符(代码片段)

本节接上一篇继续介绍Kotlin的集合操作符和如何自定义集合操作符。通过上一节Rxjava的示例,我们把同样的功能使用Kotlin来实现。Kotlin示例附上整体代码:funmain()vala=arrayOf("4","0","7","i","f",... 查看详情

快速上手kotlin开发系列之操作符(代码片段)

本节介绍操作符的实现原理以及一些常用的操作符。为了方便理解,我们把作用域函数和集合操作符统称为Kotlin的操作符。操作符的实现原理作用域函数与集合操作符的原理是完全一致的,这里以集合操作符作为一个例... 查看详情

快速上手kotlin开发系列之循环(代码片段)

本节介绍Kotlin的循环语法。下面的示例是我们最熟悉的循环语法,但是这种语法在Kotlin中是不能使用的。不过没有关系,在Kotlin中有更多适合的语法供我们选择。以下列出5种Kotlin中常用的循环语法:常用的循环语法... 查看详情

kotlin快速上手篇之android&kotlin常用开发对比(代码片段)

变量定义与常用数据类型java:inti=1;longl=2;booleanb=true;floatf=0;doubled=0;charc='A';Strings="text";Intentintent=newIntent();Kotlin:vari:Int=1var 查看详情

快速上手kotlin开发系列之反引号(代码片段)

...个不合法的字符变为合法其中第1个特性在前面的文章【快速上手Kotlin开发系列之与Java互调(1)】中已经提到过,不再赘述。今天着重介绍它的第2个特性,将不 查看详情

猿创征文|java进阶详解抽象类及常用接口(代码片段)

目录一、抽象类二、接口三、Object类3.1toString()方法3.2hashcode()方法3.3equals()方法四、常用接口4.1Comparable接口(比较)4.2Comparator接口(比较)4.3Cloneable接口(拷贝)4.4浅拷贝与深拷贝一、抽象类在Java中,一个类如果被abstract修饰称为抽... 查看详情

快速上手kotlin开发系列之解构(代码片段)

本节介绍Kotlin中特殊的数据拆箱方式:解构。解构在Kotlin中允许直接将一个类拆解之后并分别赋值,就像示例中的User对象一样,可以赋值给一个拆解开的age和name变量。解构的格式固定,val/var括号后的第一个值与U... 查看详情

快速上手kotlin开发系列之作用域函数(代码片段)

本节介绍Kotlin中的作用域函数。作用域函数是什么作用域函数是Kotlin内置的可以对数据做一系列变换的函数。它们与集合的操作符非常的相似,但是集合的操作符只能用于集合的数据变换,而作用域函数可以应用于所有... 查看详情

快速上手kotlin开发系列之协程的挂起(代码片段)

站在巨人的肩膀上做个笔记,摘录自:https://kaixue.io/kotlin-coroutines-2前言上一节中我们提到了下面的示例,它使用了async关键字来创建一个协程。launch(Dispatchers.Main)valavatar=asyncgetAvatar()//获取用户头像vallogo=asyncgetLo... 查看详情

快速上手kotlin开发系列之什么是协程(代码片段)

站在巨人的肩膀上做个笔记,摘录自:https://kaixue.io/kotlin-coroutines-1协程是什么协程的概念并没有官方的或者统一的定义,协程原本是一个跟线程非常类似的用于处理多任务的概念,是一种编程思想,并不局限... 查看详情

kotlin接口和抽象类(接口属性和方法定义|接口默认方法实现|抽象类)(代码片段)

...、接口默认方法实现三、抽象类一、接口属性和方法定义Kotlin中使用interface关键字定义接口,接口中的所有属性和函数默认都是open的,在接口实现类中,必须使用override重写接口的属性和函数;重写接口属性主要是为该属性赋值,以及... 查看详情

kotlin接口和抽象类(接口属性和方法定义|接口默认方法实现|抽象类)(代码片段)

...、接口默认方法实现三、抽象类一、接口属性和方法定义Kotlin中使用interface关键字定义接口,接口中的所有属性和函数默认都是open的,在接口实现类中,必须使用override重写接口的属性和函数;重写接口属性主要是为该属性赋值,以及... 查看详情

kotlin抽象类密封类接口(代码片段)

1.抽象类(1)概念?从多个具有相同特征的类中抽象出一个使用abstract修饰的类,以这个抽象类作为其子类模板,从而避免子类设计的随意性。抽象类的设计是一种模板模式的设计模式。(2)特点抽象类、抽象属性、抽象方法都... 查看详情

kotlin中抽象类(代码片段)

抽象类和接口很类似,抽象类不能被实例化需要使用abstract关键字声明,抽象类实现接口后,接口中没有函数体的函数可以不重写,接口中的这些方法就自动被继承到实现接口的抽象类中,称为抽象方法packageloaderman.demoopenclassbase... 查看详情

深入kotlin-接口和抽象类(代码片段)

...拥有方法实现(default关键字修饰的接口方法)。Kotlin也是同样的:interfaceA funmethod() println("A") 如果一个类B继承了接口A,因为A中的方法已经有默认实现,则B不需要实现接口A:classB:A重写接 查看详情

c#规范整理·泛型委托事件(代码片段)

...化,以便更大范围地进行代码复用。同时,它减少了泛型类及泛型方法中的转型,确保了类型安全。委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用。事件本身也是委... 查看详情