Kotlin学习 6

news2025/4/7 14:43:52

1.接口

interface Movable {
    var maxSpeed: Int
    var wheels: Int

    fun move(movable: Movable): String

}

class Car(var name: String, override var wheels: Int = 4, _maxSpeed: Int) : Movable {

    override var maxSpeed: Int = _maxSpeed
        get() = field
        set(value) {
            field = value
        }

    override fun move(movable: Movable): String {
        TODO("Not yet implemented")
    }

}

fun main() {
    val car = Car("1",4,8)

    println(car.maxSpeed)
}

1.1 接口属性默认实现

interface Movable {
    val maxSpeed: Int
       get() = (1..500).shuffled().first()//相当于给这个属性赋值  每次不一样但他不是修改它 只是修改了它的get方法 所有只读变量不可赋值

    var wheels: Int

    fun move(movable: Movable): String

}

class Car(var name: String, override var wheels: Int = 4) : Movable {

    override val maxSpeed: Int
        get() = super.maxSpeed


    override fun move(movable: Movable): String {
        TODO("Not yet implemented")
    }

}

fun main() {
    val car = Car("1",4)

    println(car.maxSpeed)
    println(car.maxSpeed)
    println(car.maxSpeed)
    println(car.maxSpeed)
}

 2.抽象类

abstract class Gun(val  range:Int){
    abstract fun pullTrigger():String
}


abstract class Gun1(val  a:Int){
    abstract fun pullTrigger():String
}
class AK47(val price:Int):Gun(range = 80),Movable{
    override fun pullTrigger(): String {
        return "AK47 shooting"
    }

    override var wheels: Int
        get() = TODO("Not yet implemented")
        set(value) {}


}

3.泛型

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


}

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

class Dog(val weight:Int)

fun main() {

    val magicBox1 = MagicBox(Boy("Jack", 20))
    val magicBox2 = MagicBox(Dog( 20))
    println(magicBox1.subject is Boy)
    println(magicBox2.subject is Dog)

}

4.泛型函数

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

    var available = false

    fun fetch():T?{
        return subject.takeIf { available } //true返回 this false返回null
    }

}

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

class Dog(val weight:Int)

fun main() {

    val magicBox1 = MagicBox(Boy("Jack", 20))
    val magicBox2 = MagicBox(Dog( 20))
    magicBox1.available =true
    println(magicBox1.fetch())
   magicBox2.available=true
    println(magicBox2.fetch())
    magicBox2.fetch()?.run {
        println("you find $weight")
    }
}

 5.多泛型参数

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

    var available = false

    fun fetch(): T? {
        return subject.takeIf { available } //true返回 this false返回null
    }

    //return -> R
    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 magicBox1 = MagicBox(Boy("Jack", 20))

    magicBox1.available =true
    val fetch = magicBox1.fetch {
        Boy("男人", 30)
    }
    println(fetch)
    println(fetch?.name)
    println(fetch?.age)
}

6.泛型类型的约束

7. vararg关键字与get函数

vararg相当于Java的可变参数  Int ... age 类似效果

class MagicBox<T:Human>( vararg item: T) {
    var subject: Array<out T> = item

    var available = false

    fun fetch(index:Int): T? {

        return subject[index].takeIf { available } //true返回 this false返回null
    }

    //return -> R
    fun <R> fetch(index: Int,subjectModFunction: (T) -> R): R? {

        return subjectModFunction(subject[index]).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 magicBox1 = MagicBox(Boy("Jack0", 20),Boy("Jack1", 20),Boy("Jack2", 20),Boy("Jack3", 20))

    magicBox1.available =true
    val fetch = magicBox1.fetch(3) {
        it
    }
    println(fetch)
    println(fetch?.name)
    println(fetch?.age)
}

8.get函数

也就是运算符重载

class MagicBox<T:Human>( vararg item: T) {
    var subject: Array<out T> = item

    var available = false

    fun fetch(index:Int): T? {

        return subject[index].takeIf { available } //true返回 this false返回null
    }

    //return -> R
    fun <R> fetch(index: Int,subjectModFunction: (T) -> R): R? {

        return subjectModFunction(subject[index]).takeIf { available }

    }

    operator fun get(index: Int):T?{
        return subject[index]
    }

}
open class  Human(val age:Int)

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

class Dog(val weight: Int)

fun main() {

    val magicBox1 = MagicBox(Boy("Jack0", 20),Boy("Jack1", 20),Boy("Jack2", 20),Boy("Jack3", 20))

    magicBox1.available =true
    val fetch = magicBox1.fetch(3) {
        it
    }
    println(fetch)
    println(fetch?.name)
    println(fetch?.age)

    println(magicBox1[3]?.name)
}

9. out 协变 in 逆变 invariant(不变)

 

//out
interface Production<out T> {
    fun product(): T
}

//in
interface Consumer<in T> {
    fun consume(item: T)
}

//不变
interface ProductionConsumer<T> {
    fun product(): T
    fun consume(item: T)
}


open class Food

open class FastFood : Food()

class Burger : FastFood()

//汉堡生产者
//食品商店
class FoodStore : Production<Food> {
    override fun product(): Food {
        println("Product Food")
        return Food()
    }

}


class FastFoodStore : Production<FastFood> {
    override fun product(): FastFood {
        println("Product FastFood")
        return FastFood()
    }

}

class BurgerStore : Production<Burger> {
    override fun product(): Burger {
        println("Product Burger")
        return Burger()
    }

}

//消费者
class EveryBody : Consumer<Food> {
    override fun consume(item: Food) {
        println("consume food")
    }

}

class ModernPeople : Consumer<FastFood> {
    override fun consume(item: FastFood) {
        println(item is Burger)
        println("consume FastFood")
    }

}

class AmericanPeople : Consumer<Burger> {
    override fun consume(item: Burger) {
        println("consume Burger")
    }

}

fun main() {
    //赋值
    val production1: Production<Food> = FoodStore()

    val product = production1.product()
    //用了Out关键字   子类转父类泛型         泛型可以协变和逆变
    val production2: Production<Food> = FastFoodStore()
    val production3: Production<Food> = BurgerStore()


    //in  父类转子类泛型
    val consumer1: Consumer<Burger> = EveryBody()
    val consumer2: Consumer<Burger> = ModernPeople()
    consumer2.consume(Burger())
    val consumer3: Consumer<Burger> = AmericanPeople()


}

10. reified关键字

 reified 和 inline 关键字配合使用能够实现泛型类型判断。因为匿名函数会被优化到这个随机类型函数中,那么就能够知道具体类型是啥了

这个函数的返回类型由backup函数的返回类型决定 和类定义的泛型无关 也就是类的泛型没有起到任何约束作用  你写一个String都可以

class MagicBox<T : Human>() {

    //产生一个指定类型的对象,如果不是指定类型的对象,就通过backup函数生成一个指定类型的对象
//    fun <T> randomOrBackUp(backup: () -> T): T {
//        val items:List<out Human>  = listOf(
//            Boy("Jack", 20),
//            Man("John", 35)
//        )
//        val random:Human =items.shuffled().first()
//        return if (random is T){  //T会被擦除
//            random
//        }else{
//            backup()
//        }
//
//    }
    inline fun <reified T> randomOrBackUp(backup: () -> T): T { //内联函数它就会被替换,泛型擦除从而解决 类型将会保留下来

        val items:List<Human>  = listOf(
            Boy("Jack", 20),
            Man("John", 35)
        )
        val random:Human =items.shuffled().first()
        return if (random is T){  //T会被擦除
            random
        }else{
            backup()
        }

    }

}

open class Human(val age: Int)

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

}

class Man(val name: String, age: Int) : Human(age){
    override fun toString(): String {
        return "Man(name='$name' age ='$age')"
    }
}

fun main() {
      val box1:MagicBox<Boy> = MagicBox()
    val subject:Man = box1.randomOrBackUp {
        Man("Jimmy", 36)
    }
    println(subject)
}

11.定义扩展函数


//给字符串追加若干个感叹号
fun String.addExt(amount:Int =1 ):String{
    return this + "!".repeat(amount)
}

fun main() {
    println("abc".addExt(3))
}

//给字符串追加若干个感叹号
fun String.addExt(amount:Int =1 ):String{
    return this + "!".repeat(amount)
}

fun Any.easyPring(){
    println(this)
}
fun Any.easyPring1(){
    println(this.toString()+1)
}

fun main() {
    println("abc".addExt(3))

    "abc".easyPring()
}

可以用private修饰符,只能在此文件下使用

12.泛型扩展函数


//给字符串追加若干个感叹号
fun String.addExt(amount:Int =1 ):String{
    return this + "!".repeat(amount)
}

private fun <T> T.easyPring():T{
    println(this)
    return this;
}
fun Any.easyPring1(){
    println(this.toString()+1)
}

fun main() {
    println("abc".addExt(3))

     "abc".easyPring().addExt(3).easyPring()
}

 13.扩展属性


val String.numVowels
        get() = count{ "aeiou".contains(it) }//true 计数器加1 

fun <T> T.easyPrint():T{
    println(this)
    return this
}

fun main() {
    "The people's Republic of China".numVowels.easyPrint()
    val count = "the".count()
    println(count)

}

 14. 可空类型扩展函数


fun String?.printWithDefault (default:String) = print(this ?: default)//如果为null就为default


fun main() {
    val  nullableString :String?  = "asdas";
    nullableString.printWithDefault("jmj")
}

15. infix关键字


 infix fun String?.printWithDefault (default:String) = print(this ?: default)//infix 对一个参数的函数 可以简化写法,去掉调用的点和括号


fun main() {
    val  nullableString :String?  = "asdas";
    nullableString printWithDefault "jmj" 
}

 16.定义扩展文件

package com.jason.kotlin.extension

fun <T> Iterable<T>.randomTask():T = this.shuffled().first()
import com.jason.kotlin.extension.randomTask

fun main() {
    val randomTask = listOf<String>("jmj", "sada", "asd").randomTask()
    println(randomTask)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1461527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相机图像质量研究(40)常见问题总结:显示器对成像的影响--画面泛白

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

过减速带控制效果优化

一、忽略纵向和横向的影响 如上图所示&#xff0c;车辆以40km/h过减速带时&#xff0c;质心垂向加速度突然变化的同时&#xff0c;纵向加速度与侧向加速度也会引起突变。 我们在之前文章里提到&#xff0c;侧向控制与纵向控制是根据侧向加速度与纵向加速度来做的&#xff0c;因…

十三:集合

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 01、Java 集合框架概述1.1、集合框架与数组的对比及概述1.2、集合框架涉及到的API 02、Collection接口方法2.1、Collection接口中的常用方法12.2、Collection接口中…

Git详解及 github与gitlab使用

目录 1.1 关于版本控制 1.1.1 本地版本控制 1.1.2 集中化的版本控制系统 1.1.3 分布式版本控制系统 1.2 Git简介 1.2.1 Git历史 1.3 安装git 1.3.1 环境说明 1.3.2 Yum安装Git 1.3.3 编译安装 1.4 初次运行 Git 前的配置 1.4.1 配置git 1.4.2 获取帮助 1.5 获取 G…

k8s-hpa控制器 16

hpa可通过metrics-server所提供pod的cpu或者内存的负载情况&#xff0c;从而动态拉伸控制器的副本数&#xff0c;从而达到后端的自动弹缩 官网&#xff1a;https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscalewalkthrough/ 上传镜像 创建hpa实例 …

连续字母长度 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。…

【蓝桥杯单片机入门记录】独立按键

目录 一、键盘、微动开关概述 二、按键工作原理 &#xff08;1&#xff09;按键构成 &#xff08;2&#xff09;&#xff08;蓝桥杯开发板&#xff09;独立按键电路图&#xff08;非实际&#xff0c;参考理解&#xff09; &#xff08;3&#xff09;独立按键工作原理 三、…

java程序流程控制

java程序有哪些流程控制、以及Java提供了哪些方案来控制程序的执行顺序&#xff1f; 程序的流程控制一般分为3种&#xff1a;顺序结构、分支结构、循环结构 顺序结构&#xff1a;就是不加任何控制&#xff0c;代码从main方法开始自上而下执行 分支结构&#xff1a;就是根据条…

高光谱图像降噪方法(2D Wavelet, 3D Wavelet, FORPDN, HyRes等方法)

近年来&#xff0c;随着遥感应用的不断深入&#xff0c;高光谱图像研究已经成为遥感领域发展最迅速的技术之一。与其他传统成像技术相比&#xff0c;高光谱图像具有更多优势&#xff1a;更丰富的信息量、纳米级的光谱分辨率以及范围更广且连续的光谱。因此&#xff0c;在农业、…

学习SpringMVC第二天

第一种方法与springmvc无关 , 用的是tomcat的东西在web.xml里配置 第二种方法 : 用SpringMVC解决 ,设置静态资源映射匹配 , 在Spring-mvc.xml里配置 第三种方法: 还是用SpringMVC解决 , 直接加一个 <mvc:default-servlet-handler/>, 在spring-mvc.xml里配置 第二种方法…

虹科方案 | 释放总线潜力:汽车总线离线模拟解决方案

来源&#xff1a;虹科汽车智能互联 虹科方案 | 释放总线潜力&#xff1a;汽车总线离线模拟解决方案 原文链接&#xff1a;https://mp.weixin.qq.com/s/KGv2ZOuQMLIXlOiivvY6aQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #汽车总线 #ECU #汽车网关 导读 传统的…

【RPG Maker MV 仿新仙剑 战斗场景UI (一)】

RPG Maker MV 仿新仙剑 战斗场景UI 一 战斗场景制作原版仙剑战斗UI原版RPG Maker MV战斗UI启航战斗菜单 战斗场景制作 RPG Maker 中战斗场景的UI是比较经典的日式RPG的UI布局&#xff0c;现在尝试将它变成仙剑这样的布局看看。。。 原版仙剑战斗UI 这里只截图了开始的战斗UI…

Git笔记——2

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、撤销修改__情况一 二、撤销修改__情况二 三、撤销修改__情况三 四、删除文件 五、理解分支 六、创建、切换和合并分支初体验 七、删除分支 八、合并冲突 总…

多个.C 文件关于全局变量如何使用

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合 [回溯篇]

代码随想录算法训练营第二十四天 回溯算法理论基础什么是回溯法回溯法的理解回溯法模板 LeetCode 77.组合题目描述思路参考代码总结优化版本 回溯算法理论基础 文章讲解&#xff1a;代码随想录#回溯算法理论基础 视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇&#…

pclpy 安装和使用

pclpy 安装和使用 一、安装pclpy二、问题与解决方法三、测试四、测试结果五、相关链接 一、安装pclpy pclpy是点云库(PCL)的Python绑定。使用CppHeaderParser和pybind11从头文件生成。这个库正在积极开发中&#xff0c;目前Windows只支持python 3.6 x64 和 python3.7&#xff…

Shell基础和变量使用

一、Shell概述 1、什么是shell Shell是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务&#xff0c;在用户和内核之间充当翻译官的角色&#xff0c;是一个命令解释器。 Shell是一种编程语言&#xff0c;只是比较古…

动态内存管理(下)

动态内存管理&#xff08;上&#xff09;-CSDN博客&#xff08;malloc&#xff0c; realloc&#xff0c; calloc&#xff0c; free函数的用法以及注意事项等知识点&#xff09; 动态内存管理&#xff08;中&#xff09;-CSDN博客&#xff08;常见的内存出错问题) -----------…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化

在Simulink中使用ROS2控制无人机沿自定义圆形轨迹飞行并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模型并完成基本配置整体框架各子系统实现原理…

MySQL 安装步骤

下载地址&#xff1a;https://downloads.mysql.com/archives/community/&#xff0c; 选择第二个 将下载的压缩包解压到自己想要放到的目录下&#xff08;路径中最好不要有中文&#xff09; 一、添加环境变量 环境变量里面有很多选项&#xff0c;这里我们只用到Path这个参数…