Kotlin中泛型与infix函数

Kotlin中泛型与infix函数

文章内容来自于学习《第一行代码(第三版)》

泛型

在一般的编程模式之下,我们需要给任何一个变量指定一个具体的类型,而泛型允许我们在不指定具体类型的情况下进行编程,这样编写出来的代码将会拥有更好的扩展性。
泛型主要有两种定义方式:一种是定义泛型类,另一种是定义泛型方法,使用语法结构都是。
例如我们要定义一个泛型类,

class MyClass<T>{
    fun method(param:T):T{
        return param
    }
}

此时的MyClass就是一个泛型类,MyClass中的方法允许使用T类型的参数和返回值
调用MyClass类和method()方法的时候,可以将泛型指定成具体的类型,如下:

val myClass=MyClass<Int>()
val result=myClass.method(123)
println("result is $result")

定义一个泛型方法:

class MyClass2 {
    fun <T>method(param:T):T{
        return param
    }
}

调用方式如下:

val myClass2=MyClass2()
var result2 = myClass2.method<Int>(123)
println("result2 is $result2")

由于kotlin有出色的类型推导机制,它能够自动推导出泛型的类型,因此上面调用的方式可以直接省略泛型的指定

val myClass2=MyClass2()
var result2 = myClass2.method(123)
println("result2 is $result2")

对泛型的类型进行一定的限制
还可以通过指定上界的方式来对泛型的类型进行约束,比如将method()方法的泛型上届设置为Number类型

class MyClass3 {
    fun <T : Number> method(param: T): T {
        return param
    }
}

这种写法表明,我们只能将method()方法的泛型指定成数字类型,比如Int、Float、Double等。但是如果指定成字符串类型就会报错。

infix–使用infix函数构建更可读的语法

val map= mapOf("Apple" to 1,"Banana" to 2,"Orange" to 3,"Pear" to 4,"Grape" to 5)

例如如上代码块所示,再kotlin中往map集合中添加数据用到了类似A to B这样的语法结构,
这是kotlin提供的一种高级语法糖特性:infix函数。
下面通过一个例子来具体说明infix函数,
String类中有一个startsWith()函数,它可以用于判断一个字符串是否是以某个指定参数开头的。比如下面这段代码:

if("Hello Kotlin".startsWith("Hello"){
//处理具体的逻辑
}

下面通过infix函数以一种更可读性的语法来表达这段代码。新建一个infix.kt文件,然后编写如下代码:

infix fun String.beginsWith(prefix:String)=startsWith(prefix)

这是一个String的扩展函数。我们给String类添加了一个beginsWith()函数,它也是用于判断一个字符串是否是以某个指定参数开头的,并且它的内部实现就是调用的String类的startsWith()函数。
但是前面加上infix关键字后,beginsWith()函数就变成了一个infix函数,这样除了传统的函数调用之外,我们还可以用一种特殊的语法糖格式调用beginsWith()函数,如下所示:

if("Hello Kotlin" beginsWith "Hello"){
//处理具体的逻辑
}

如上所示,infix函数允许我们将函数调用的小数点、括号等计算机相关语法去掉,从而使用一种更接近英语的语法来编写程序,让代码看起来更加具有可读性。
另外,infix函数由于其语法糖格式的特殊性,有两个比较严格的限制:首先,infix函数是不能定义成顶层函数的,它必须是某个类的成员函数,可以使用扩展函数的方式将它定义到某个类当中;其次,infix函数必须接收且只能接收一个参数,至于参数类型是没有限制的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值