首页 > 其他分享 >Kotlin中那些让你眼花缭乱的关键字和操作符

Kotlin中那些让你眼花缭乱的关键字和操作符

时间:2024-04-04 20:58:20浏览次数:11  
标签:fun 非空 Java val Kotlin object 关键字 操作符 类型

符号含义说明示例
Int非空类型val x : Int = 10
Int?可空类型val x : Int? = null
Int!不确定类型不确定是否非空
可以赋值给非空类型,也可以赋值给可空类型
这个类型无法主动使用,只是兼容其它语言的一种方式
只能在Kotlin调用其它语言时,由编译器进行提示
?.非空则执行非空则执行语句,返回执行结果,否则返回nullcallback?.doCallback()
!!断言非空断言值非空,如果为空,则抛出空指针
相当于Java中的assert(this != null)
val user = getUser()!!
?:为空指定替代值为空时,返回一个指定的非空替代值val user = getUser() ?: DefaultUser
Any任意类型在kotlin中,任意对象都是Any
不管是基本类型,对象类型,还是函数类型
相当于Java中的Object,但是比Object覆盖范围更广
在kotlin中,原则上是不给使用Object的
Any也是区分非空和可空的,null只赋值给Any?类型
object单例类型既是类型,同时也是该类型的唯一对象object X
val x : X = X
Unit空类型相当于Java中的void,它是通过object类型来定义的
在Kotlin中,所有函数都有返回值
如果不需要返回值,则可以用Unit来代替
我们也可以省略它,编译器会帮我们自动补全
Unit属于object,object属于Any
fun getInt(): Unit {
  return Unit
}
companion object伴生对象同类一起创建的对象,类似于Java中的静态变量
由于kotlin中的函数也算对象,所以companion也可以定义函数
注意,伴生对象只是在访问方式上类似于Java中的static
但它并不是真正的static,在Java中通过反射是无法获取的
companion object {}
<*>未知类型kotlin泛型中的*表示不确定泛型中的元素类型
List<*>只能获取元素,无法添加元素
因为无法确定泛型值,意味着无法保证修改时的类型安全
List<*>中获取的元素全部通过Any?类型来存储
val list: MutableList<*> = mutableListOf(“abc”, 1, true)
val item = list[0]
<in T>逆变可以接受当前类和父类泛型
in可以理解为input,消费一个对象
Consumer<Apple> = Consumer<Food>
<out T>协变可以接受当前类和子类泛型
out可以理解为output,生产一个对象
Producer<Food> = Producer<Apple>
<reified T>具化必须配合inline来使用
在编译期间,根据T的类型,智能决定执行哪段代码
inline fun <reified T> Bundle.plus(key: String, value: T) {
  when(value) {
    is Int-> putInt(key, value)
    is Long -> putLong(key, value)
  }
}
infix fun中缀函数通过中缀操作符的形式
来替代a.func(b)形式的代码
fun main() {
  val x1 = “Age” assign 15
  val x2 = “Age” mapper 15
}
infix fun String.assign(other: Int) = “$this = $other”
infix fun <A, B> A.mapper(b: B) = “$this = $b”
implies编译器推断告诉编译器,当返回某个值时,意味着某个条件成立@ExperimentalContracts
public inline fun CharSequence?.isNullOrEmpty(): Boolean {
 contract {
    returns(false) implies (this@isNullOrEmpty != null)
  }
return this == null || this.length == 0
}

标签:fun,非空,Java,val,Kotlin,object,关键字,操作符,类型
From: https://blog.csdn.net/u013718730/article/details/137381944

相关文章

  • Java 标识符&关键字
    关键字关键字(Keywords)在编程语言中具有特殊意义的保留字。它们是语言的基础构建块,用于定义程序的结构和逻辑。在Java中,关键字共有53个。这些关键字具有特殊的语法含义,不能用作标识符(例如变量名、类名、方法名等),因为它们在Java中已经有了特定的用途。Java中关键字有以下几......
  • Final关键字
    final可以修饰类、属性、方法、局部变量。不希望类被继承时使用不希望父类的某个方法被子类覆盖或重写final的基本操作publicclassFinal01{publicstaticvoidmain(String[]args){}}finalclassA{}//不允许被继承的类//classBextendsA{}cla......
  • (C++)auto关键字(C++11)——<入门>
    类型别名思考:随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:1.类型难于拼写2.含义不明确导致容易出错#include<string>#include<map>intmain(){std::map<std::string,std::string>m{{"apple","苹果"},{"orange","橙子"......
  • 【每日C语言】Day6——变量与操作符
    目录2.4变量4.1变量的创建4.2 变量的分类2.5算术操作符:+、-、*、/、%5.1+和-5.2 *5.3 /5.4%2.6赋值操作符:=和复合赋值6.1 连续赋值6.2复合赋值符2.7单目操作符:++、--、+、-7.1++和--7.1.1 前置++ 7.1.2 后置++7.1.3 前置--7.1.4 后置--7.2+和......
  • 详解volatile 关键字的作用,Java 中能创建 volatile 数组吗
    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点面试官:volatile关键字的作用可见性:当一个线程修改了volatile变量的值,这个新值对于其他线程是立即可见的。这是因为在多线程环境下,线程在修改volatile变量的值时......
  • this关键字
    this关键字只能用于方法方法体内,在类中的非静态方法中使用。this表示当前对象。Java的this关键字的作用:①引用类中的数据成员②引用类中的成员方法;③调用本类的构造方法;④表示当前对象。“this.数据成员”引用对象的数据成员this.数据成员名“this.方法()”引用对象......
  • Kotlin基础-变量
    1.变量vara:Int=2//声明一个变量vara=3//明确知道类型的情况下可以不标明类型vara:Int//不知道类型的情况下要声明类型vara:String?=null//声明一个String?类型,值可以为String也可以为nulllateinitvara:String//必须为不可null类型,后面要......
  • 面向对象14:static关键字详解
    ackagecom.oop.demo07;publicclassStudent{//staticprivatestaticintage;//静态变量多线程里会用到privatedoublescore;//非静态变量publicstaticvoidmain(String[]args){Students1=newStudent();System.out.p......
  • extern 关键字------非原创
    前面总结了static关键字,下面先说说static和extern能同时使用吗?答案是不能。 extern修饰全局变量和函数,被修饰的变量和函数可以在别的文件里使用。static修饰的变量和函数作用范围仅限于定义它的文件内部。 static要求去除符号表名称,extern要求通过符号名称链接,他俩先天就矛......
  • 二叉树结点关键字输出的递归算法实现
    在计算机科学中,二叉树是一种重要的数据结构,广泛应用于各种算法和程序设计中。二叉树的遍历是二叉树操作中的基础问题之一,其目的是以某种规则访问二叉树的每个结点,使得每个结点被且仅被访问一次。给定一个具有n个结点的二叉树,我们需要编写一个递归过程,以O(n)的时间复杂度输出......