今天我们来学学Kotlin中的智能转化。
在开始说概念之前,我们先说说Java中的一个现象,然后再对比Kotlin中的处理。
Java中的instanceof
首先说说instanceof的用法,它是用来判断左边的对象是不是右边类的实例。如果左边的对象为null,则返回false。如果左边的对象是右边类的实例,或者是左边的对象是右边类的子类的实例,则返回true。下面放上一个Java示例代码。
Java代码
//账单类
public class Bill {
}
//用水账单
public class WaterBill extends Bill{
}
//电费账单
public class ElectricityBill extends Bill{
}
public class Main {
//计算账单
public double calcBill(Bill bill){
double result = 0;
if (bill instanceof WaterBill){
//计算水费
WaterBill waterBill = (WaterBill) bill;
}
if (bill instanceof ElectricityBill){
//计算电费
ElectricityBill electricityBill = (ElectricityBill) bill;
}
return result;
}
}
上面的代码通过传入的bill对象使用instanceof来判断它属于哪一种类型的账单,然后再调用不同的计算方法。当然上面的代码也可以不使用instanceof来处理,下面是另一种使用多态的写法。
public double calcBill(WaterBill waterBill){
double result = 0;
return result;
}
public double calcBill(ElectricityBill electricityBill){
double result = 0;
return result;
}
上面的代码是使用了方法重载来避免使用instanceof。
Kotlin中的智能转换
智能转换,用一句话来总结就是它合并了类型检查和转换这两步操作。可能这么说有些空洞,上代码来解释。
上面的Java代码中,我们看到了这样的代码
if (bill instanceof WaterBill){
//计算水费
WaterBill waterBill = (WaterBill) bill;
}
这里的代码就是先做了类型检查,之后再做了类型的转换。而在Kotlin中这两步操作它帮我们简化了。
Kotlin代码
interface Bill{
}
class WaterBill: Bill{
//添加一个方法
fun water(){
}
}
class ElectricityBill: Bill {
//添加一个方法
fun electricity(){
}
}
fun calcBill(bill: Bill): Double{
if(bill is WaterBill){
//不需要强制转换,直接调用
bill.water();
}
if (bill is ElectricityBill){
bill.electricity();
}
return 0.0;
}
上面的代码有几点需要注意:
1. 上面有一个Bill接口,然后在具体类中通过:接口名
表示实现该接口。
2. 使用is
来做类型检查,等同于Java中的instanceof
。
3. 不需要强制类型转化,直接可以调用对应的方法。
写在最后
Kotlin中的智能转换特性可以让我们写出更简洁和优雅的代码,后续我们将会了解到更多的这种特性。