Java转Kotlin:智能类型转换

1,327 阅读1分钟

例子

Java中的类型转换

//Java
public class Main {
    public static void main(String[] args) {
        Person bob = new Chinese("Bob");
        if (bob instanceof Chinese) {
            System.out.println(((Chinese)bob).name);//重点
        }
    }
}

interface Person {}

class Chinese implements Person {
    public String name;
    public Chinese(String name) {
        this.name = name;
    }
}

Kotlin中的智能类型转换

interface Person

class Chinese(var name: String) : Person

fun main() {
    var bob: Person = Chinese("Bob")
    if (bob is Chinese) {
        println(bob.name)//重点
    }
}

如下图

对象bob已经经过了类型判断,再进行强制类型转换是多余的。在这样的情形下,Kotlin编译器将为我们进行智能类型转换。

再例

Kotlin空类型智能类型转换

//Kotlin
fun main() {
    val hello: String? = "Hello"
    if (hello != null) {
        println(hello.length)
    }
}

判断有效的大括号范围内,hello被只能转换成String,在大括号外,hello仍是String?类型。

不支持智能类型转换的情形

IDE告诉我们,此情形下的hello变量是一个全局变量,可能被main线程之外的线程访问修改,因此,即使已经有了hello != null的判断,也不能保证hello在被使用时是非空的String类型。因此,无法进行智能类型转换。

安全类型转换

Kotlin使用关键字as对类的对象进行强制类型转换,但是,转换可能并不能成功。基于此,Kotlin推出了安全类型转换。

bob as Chinese ---> bob as? Chinese

使用as?关键字,如转换不成功,语句将返回null

类型转换的建议

  • 尽可能使用val来声明不可变引用,让程序的含义更加清晰确定;
  • 尽可能减少函数对外部变量的访问,也为函数式编程提供基础;
  • 必要时创建局部变量指向外部变量,避免因它变化引起程序错误。

总结