12/08/2018, 15:15

Kotlin for Android: Introduce about Reified Types

How to use the type within a function? Hi mọi người, hôm nay mình sẽ giới thiệu với mọi người một tính năng hay ho nữa của Kotlin, như mọi người biết, một trong những hạn chế của java khi dùng generics là không thể sử dụng trực tiếp một kiểu, thay vào đó chúng ta sẽ truyền class như một tham số, ...

How to use the type within a function?

Hi mọi người, hôm nay mình sẽ giới thiệu với mọi người một tính năng hay ho nữa của Kotlin, như mọi người biết, một trong những hạn chế của java khi dùng generics là không thể sử dụng trực tiếp một kiểu, thay vào đó chúng ta sẽ truyền class như một tham số, điều này khiến cho code chúng ta trở nên phức tạp và không tường minh.

Cảm ơn Kotlin, bằng cách sử dụng inline function, bây giờ chúng ta hoàn toàn có thể sử dụng kiểu bên trong function, như một reified types.

So, lets go!

Reified types

Start activity

Đây là một trường hợp điển hình trong android, để gọi hàm startActivity trong android, chúng ta phải chỉ định activity nguồn và activity đích như là một tham số.

Với Kotlin, chúng ta đơn giản chỉ là gán một kiểu cho hàm, như này:

inline fun <reified T : Activity> Activity.startActivity() {
    startActivity(Intent(this, T::class.java))
}

Bây giờ việc gọi một lệnh start mới một activity (ở acitivity nguồn ) chỉ là:

    
startActivity<DesActivity>()

Find view by ID

Có một điều là không nhiều lập trình viên android sử dụng generics trong trường hợp này, việc sử dụng một generics trả một một object và cast qua kiểu mong muốn là một cách khá hữu ích, với Java, chúng ta có thể tạo một hàm như thế này:

public <T extends View> T findView(Activity activity, int id) {
    return (T) activity.findViewById(id);
}

và sử dụng chúng như thể này:

TextView textView = AnyUtils.findView(activity, R.id.tv);

Còn trong Kotlin, bằng việc sử dụng extension functions, chúng ta cũng có thể tạo một hàm như vậy, đơn giản hơn:

fun <T : View> Activity.findView(id: Int) = findViewById(id) as T

val textView = activity.findView<TextView>(R.id.tv)

Tuy nhiên, với cả 2 cách trên, chúng ta có thể nhận ra rằng trình biên dịch không thể chắc chắc rằng việc ép kiểu là đúng đắn, bởi vì nó không thể truy cập được vào kiểu của T (ở đây sẽ có một warning) May thay, với reified types, chúng ta có thể tránh được rắc rối trên:

inline fun <reified T : View> Activity.findView(id: Int) = findViewById(id) as T

Kết

Bằng cách sử dụng reified types, chúng ta có thể tạo ra những hàm an toàn hơn, tường minh hơn, have fun !

0