Kotlin系列之智能转换

今天我们来学学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中的智能转换特性可以让我们写出更简洁和优雅的代码,后续我们将会了解到更多的这种特性。

Kotlin中,有两种类型转换方式:智能类型转换和强制类型转换智能类型转换是指在特定情况下,Kotlin编译器会自动推断变量的类型,无需显式进行类型转换。这种类型转换在编译期间完成,并且只适用于不同类型之间的子类型关系。例如,当将一个子类型的对象赋值给父类型的变量时,Kotlin会自动将其转换为父类型。 另一种类型转换方式是强制类型转换,使用as和as?操作符进行。强制类型转换需要显式指定要转换的类型,并且在运行时进行类型检查和转换。当无法进行智能类型转换时,可以使用强制类型转换。需要注意的是,如果强制类型转换失败,会抛出ClassCastException异常。而使用as?操作符可以避免抛出异常,当转换失败时会返回null。 下面是一个示例代码,演示了如何在Kotlin中进行类型转换: ```kotlin fun main(args: Array<String>) { var a: Any = "1" var b: String = a as String // 强制将a转换为String类型 println(b.length) } ``` 在上述代码中,变量a的类型为Any,通过使用as操作符将其强制转换为String类型,然后可以访问String类型的属性和方法,如示例中的b.length。 总结起来,Kotlin中的类型转换智能类型转换和强制类型转换两种方式。智能类型转换适用于子类型关系,而强制类型转换使用as和as?操作符进行,可以在特殊情况下进行类型转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值