Tôi thực sự đã có câu hỏi chính xác này 30 phút trước, vì vậy tôi bắt đầu đào bới và không thể tìm thấy bất kỳ giải pháp hay cách giải quyết nào cho việc này, NHƯNG trong khi tìm kiếm tôi đã tìm thấy phần này trên trang web của Kotlinglang nói rằng:
Lưu ý rằng tiện ích mở rộng có thể được xác định bằng loại máy thu không thể nhận được. Các phần mở rộng như vậy có thể được gọi trên một biến đối tượng ngay cả khi giá trị của nó là null.
Vì vậy, sau đó tôi đã có ý tưởng điên rồ nhất, tại sao không định nghĩa một hàm mở rộng với một bộ thu nullable (mà không thực sự sử dụng bộ thu đó) và sau đó gọi nó trên một đối tượng null! Vì vậy, tôi đã thử nó, và nó hoạt động khá tốt, nhưng nó trông rất xấu xí. Nó là như thế này:
(null as Type?).staticFunction(param1, param2)
Vì vậy, tôi đã khắc phục điều đó bằng cách tạo một val trong tệp tiện ích mở rộng thuộc loại máy thu có giá trị null và sau đó sử dụng nó trong lớp khác của tôi. Vì vậy, như một ví dụ, đây là cách tôi triển khai chức năng mở rộng "tĩnh" cho Navigation
lớp trong Android: Trong tệp NavigationExtensions.kt của tôi:
val SNavigation: Navigation? = null
fun Navigation?.createNavigateOnClickListener(@IdRes resId: Int, args: Bundle? = null, navOptions: NavOptions? = null,
navigationExtras: Navigator.Extras? = null) : (View) -> Unit {
//This is just implementation details, don't worry too much about them, just focus on the Navigation? part in the method declaration
return { view: View -> view.navigate(resId, args, navOptions, navigationExtras) }
}
Trong mã sử dụng nó:
SNavigation.createNavigateOnClickListener(R.id.action_gameWonFragment_to_gameFragment)
Rõ ràng, đây không phải là một tên lớp, nó chỉ là một biến của loại lớp có giá trị null. Điều này rõ ràng là xấu về phía nhà sản xuất tiện ích mở rộng (vì họ phải tạo biến) và về phía nhà phát triển (vì họ phải sử dụng SType
định dạng thay vì tên lớp thực tế), nhưng đây là cách gần nhất có thể đạt được ngay bây giờ so với các hàm tĩnh thực tế. Hy vọng, các nhà sản xuất ngôn ngữ Kotlin sẽ phản hồi vấn đề đã được tạo và thêm tính năng đó vào ngôn ngữ.