一. Kotlin相比Java有哪些优点.
(1).kotlin优势
-
代码简洁,开发效率更高 不用使用findViewById,支减少冗余代码,支持空安全,扩展函数,属性,高阶函数和lambda表达式,内联函数。
-
内存消耗更少 由于空安全特性和内联函数优化,它能够生成更高效的字节码,从而减少内存的使用。kotlin协程提供了一种轻量级的并发处理方式,可以进一步降低内存的占用。
-
kotlin是未来Android开发主流的语言,一些Android的新特性,新组件都会优先支持kotlin版本。
(2).kotlin劣势 kotlin编译速度相对java较慢,因为她需要进行额外的类型检查(空安全),和代码转换(kotlin-java-java字节码,复杂,耗性能)
备注:Kotlin与Java在运行时性能方面基本相当,由于kotlin支持inline函数,lambda表达式,在某些情况下性能还要由于java.
二 .Kotlin内置的高阶函数run的原理是什么,与let函数有啥区别?
kotlin
(1).inline :表示这是一个内联函数,将函数代码直接插入调用处,避免了调用普通方法时,栈帧的创建,销毁所带来的开销。
(2).<T,R> T.run :T代表要为T扩展出一个名为run的函数,R表示lambda表达式最后一行返回的类型。
(3).block:T.()->R:
block:表示lambda的名称
T.():表示输入参数是T本身,让lambda表达式持有了this表示(T)调用者本身
R:表示lambda最后一行返回的类型.
(T) :表示输入参数是T本身,让lambda表达式持有了it表示(T)调用者本身
public inline fun<T,R> T.let(block:(T)->R){
return block(this)
}
public inline fun<T,R> T.run(block:T.()->R):R{
return block()
}
//with不是泛型的扩展方法,而是全局方法
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
return receiver.block()
}
public inline fun <T> T.also(block: (T) -> Unit): T {
block(this)
return this
}
public inline fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}
fun main(){
var result1="778".run{
true
length
}
println(result1) //3
var result2="778".let{
999
"$it" //778
}
}
为啥所有的类型都可以使用run或者let,那是因为高阶函数let和run是对泛型进行扩展,意味着所有类型都等于泛型,所以任何地方都可以使用.run和let的区别在于lambda表达式一个持有this表示调用者本身,一个持有it表示调用者本身。
php
public inline <T> T.apply(block:T.()->unit):T
public inline <T> T.also(block:(T)->unit):T
public int <T,R> with(receiver:T,block:T.()->R):R
三 .kotlin语言泛型的形变是什么?【 extends out || super in】
- 不变:指的是此泛型既可以是消费者,可以是生产者,没有任何继承相关的概念.
csharp
class Student<T> {}
- 协变 : 指的是此泛型只能是生产者 ,泛型类型只能是T或者T的子类,只能get数据,无法add数据.
csharp
ArrayList<out T>
- 逆变:指的是此泛型只能是消费者,泛型类型只能是T类型,或者T的父类,只能add数据,无法get【如果get数据,数据类型只能是Object】
r
ArrayList<in T>