Kotlin学习 6

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)
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ Primer 笔记(总结,摘要,概括)——第4章 表达式

目录 4.1 基础 4.1.1 基本概念 4.1.2 优先级与结合律 4.1.3 求值顺序 4.2 算术运算符 4.3 逻辑和关系运算符 4.4 赋值运算符 4.5 递增和递减运算符 4.6 成员访问运算符 4.7 条件运算符 4.8 位运算符 4.9 sizeof运算符 4.10 逗号运算符 4.11 类型转换 4.11.1 算数转换…

Java的编程之旅19——使用idea对面相对象编程项目的创建

在介绍面向对象编程之前先说一下我们在idea中如何创建项目文件 使用快捷键CtrlshiftaltS新建一个模块&#xff0c;点击“”&#xff0c;再点New Module 点击Next 我这里给Module起名叫OOP,就是面向对象编程的英文缩写&#xff0c;再点击下面的Finish 点Apply或OK均可 右键src…

day3:界面跳转,qss与对话框

思维导图 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配…

成像光谱遥感技术中的AI革命:ChatGPT应用指南

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能在解…

【Effective Objective - C】—— 系统框架

【Effective Objective - C】—— 系统框架 47.熟悉系统框架CoreFoundation框架其他框架要点 48. 多用块枚举&#xff0c;少用for循环for循环使用Objective-C 1.0的NSEnumerator遍历快速遍历基于块的遍历方式要点 49.对自定义其内存管理语义的collection使用无缝桥接要点 50.构…

虚拟机器centos7无法识别yum 命令异常处理笔记

问题现象 启动虚拟机后执行ipconfig 提示未找到该命令,然后执行yum install -y net-tools提示 curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"的错误 [roothaqdoop~]# ifconfig -bash: ifconfig: 未找到命令 [roothadoop~]# yum install …

【QT 5 +Linux下软件桌面快捷方式+qt生成软件创建桌面图标+学习他人文章+第二篇:编写桌面文件.desktop】

【QT 5 Linux下软件桌面快捷方式qt生成软件创建桌面图标学习他人文章第二篇&#xff1a;编写桌面文件.desktop】 1、前言2、实验环境3、自我学习总结-本篇总结1、新手的疑问&#xff0c;做这件事目的2、了解.desktop3、三个关键目录以及文件编写1、目录&#xff1a;/opt/2、目录…

ChatGPT回答模式

你发现了吗&#xff0c;ChatGPT的回答总是遵循这些类型方式。 目录 1.解释模式 2.类比模式 3.列举模式 4.限制模式 5.转换模式 6.增改模式 7.对比模式 8.翻译模式 9.模拟模式 10.推理模式 1.解释模式 ChatGPT 在回答问题或提供信息时&#xff0c;不仅仅给出…

智能科技助力服装业:商品计划管理系统的革命性变革

随着智能科技的飞速发展&#xff0c;服装行业正在经历前所未有的变革。在这股浪潮中&#xff0c;商品计划管理系统的智能化转型成为了行业的核心驱动力。这种变革不仅极大地提高了服装企业的运营效率和市场竞争力&#xff0c;更为整个行业的可持续发展注入了新的活力。 智能商…

相机图像质量研究(35)常见问题总结:图像处理对成像的影响--运动噪声

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

T-Dongle-S3开发笔记——移植LVGL

添加lvgl组件 idf.py add-dependency lvgl/lvgl>8.* 新建终端执行命令后出现了新的文件&#xff1a; 清除再编译后才会出现lvgl库 优化为本地组件 以上方式修改了组件文件内容重新编译后文件又会变回去。 所以我们要把lvgl变成本地组件 1、要把 idf_component.yml 文…

【Python】遇到的一些小问题及解决办法汇总

【工具】&#xff1a;pycharm 【环境】&#xff1a;Windows 一、数据集路径导入报错 【错误提示】&#xff1a; SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape 如图&#xff1a; 【原因分析】&a…

visual studio2022使用tensorRT配置

只记录tensorRT在vs中使用时的配置&#xff0c;下载和安装的 文章主页自己寻找。 下载好TensorRT和对应的cuda之后&#xff0c;把tensorRT的锻炼了和lib文件复制粘贴到cuda对应的文件夹中&#xff0c;以方便调用。 完成之后打开vs新建一个tensorRT的项目&#xff0c;然后开始配…

文件上传漏洞--Upload-labs--Pass20--数组绕过

一、漏洞原理 漏洞来源&#xff1a;count()函数漏洞。 现自定义一个数组 arr[]&#xff0c;定义arr[0]1,arr[3]2, 此时count(arr)的值为2&#xff0c;则arr[count[arr]]即为arr[2]&#xff0c;但是arr[2]未定义&#xff0c;即为一个空值&#xff0c;若使用count()函数的本意是…

Windows10和Ubuntu22.04双系统安装

概要&#xff1a; 本篇演示Windows10和Ubuntu22.04双系统的安装&#xff0c;先安装Windows10&#xff0c;再安装Ubuntu22.04。 先安装Ubuntu22.04&#xff0c;后安装Windows10见&#xff1a; Ubuntu22.04和Windows10双系统安装-CSDN博客 一、说明 1、电脑 笔者的电脑品牌…

PhpStorm 2023:卓越的代码质量,无与伦比的调试体验 mac/win版

JetBrains PhpStorm 2023是一款针对PHP开发者的强大集成开发环境(IDE)&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助开发者更高效地编写、调试和测试PHP应用程序。 PhpStorm 2023 软件获取 首先&#xff0c;JetBrains PhpStorm 2023具备强大的代码编辑功能&#xff0…

SAP STO VLPOD 报错 QA495 XXX 的问题

原因&#xff1a; 质检物料在中生成采购订单的时候的质检状态不对 PS物料是否需要质检在质量视图里面的

高级语言期末2015级唐班B卷

1.编写函数&#xff0c;按照如下公式计算圆周率π的值&#xff08;精确到1e-5&#xff09; #include <stdio.h>double pai() {double last0;double flag1;int n1;while(flag-last>1e-5) {lastflag;flag*1.0*(2*n)*(2*n)/((2*n-1)*(2*n1));n;}return 2*last; }int main…

3Dmax效果图是如何做出来的?

如果不知道3Dmax效果图是如何做出来的朋友&#xff0c;可以通过这篇文章有一个概念。 我们需要先准备两款通用软件&#xff0c;3Dmax建模软件和Photoshop图形制作软件。 一、构建模型 我们以常见的室内为例&#xff0c;通过“样条线”或者基础“几何体”来创造我们需要的物体…

HTML好玩代码合集(1)

VIP代码合集🧧,这一期是场景式HTML代码,里面的文字也是可以修改的,不知道怎么修改可以私信我。 效果(玩个梗,别在意): 好玩代码: <!DOCTYPE html> <html> {#jishugang#}<head><meta charset="utf-8" /><title>怎么堵船了�…