Smart Casting là một tính năng của Kotlin compiler có thể dựa vào các điều kiện, hoàn cảnh trước đó của một biến để tự động cast biến đó về kiểu dữ liệu phù hợp, chính xác nhất cho biến đó.
Ví dụ mình có một class Student:
1 2 3 4 5 |
package com.huongdankotlin class Student { val name: String = "" } |
và một method được định nghĩa trong class main để chạy ví dụ như sau:
1 2 3 4 5 |
fun casting(x: Any) { if (x is Student) { println(x.name) } } |
Kết quả khi các bạn chạy đoạn code ví dụ sau:
1 2 3 4 5 6 |
fun main() { var student = Student() student.name = "Khanh" casting(student); } |
sẽ là:
Như các bạn thấy, Kotlin compiler đã tự động cast biến x trong method casting() qua đối tượng Student sau khi kiểm tra nó là thể hiện của class Student và in ra tên của sinh viên.
Nếu các bạn kiểm tra biến x: nếu không phải là đối tượng của class Student trước thì return, ngược lại thì in ra tên của sinh viên như sau:
1 2 3 4 5 6 7 |
fun casting(x: Any) { if (x !is Student) { return } println(x.name) } |
Kotlin compiler cũng tự động cast biến x qua thể hiện của class Student mà không hề báo lỗi gì cả:
Đoạn code sau cũng valid với Kotlin nhé các bạn:
1 2 3 4 5 |
fun casting(x: Any) { if (x is Student && x.name.length >= 5) { println("Valid student name!") } } |
Vì trong câu lệnh if, điều kiện đầu tiên đã thoả mãn nên Kotlin sẽ tự động cast x qua đối tượng Student và do đó, chúng ta có thể gọi thuộc tính name của đối tượng Student và kiểm tra độ dài.
Kết quả như sau các bạn:
Nói tóm lại, một cách rất tự nhiên, dựa vào context trước đó của code, Kotlin sẽ tự động cast kiểu dữ liệu của các biến qua một đối tượng phù hợp ở thời điểm compile time luôn.