2017-05-25 29 views
10

Tôi đã các chức năng mở rộng sau đây đơn giản Kotlin:Kotlin tài sản: "Loại tham số của một tài sản phải được sử dụng trong loại máy thu của nó"

// Get the views of ViewGroup 
inline val ViewGroup.views: List<View> 
    get() = (0..childCount - 1).map { getChildAt(it) } 

// Get the views of ViewGroup of given type 
inline fun <reified T : View> ViewGroup.getViewsOfType() : List<T> { 
    return this.views.filterIsInstance<T>() 
} 

Mã này biên dịch và hoạt động tốt. Nhưng, tôi muốn hàm getViewsOfType là thuộc tính, giống như views. Android Studio thậm chí còn đề xuất nó. Tôi cho AS làm việc tái cấu trúc và tạo mã này:

inline val <reified T : View> ViewGroup.viewsOfType: List<T> 
    get() = this.views.filterIsInstance<T>() 

Nhưng mã này không biên dịch. Lỗi này gây ra lỗi: "Loại tham số của thuộc tính phải được sử dụng trong loại máy thu"

Sự cố ở đây là gì? Tìm kiếm trợ giúp về lỗi này dường như không dẫn đến câu trả lời.

Trả lời

10

Lỗi có nghĩa là bạn chỉ có thể có thông số loại chung cho thuộc tính tiện ích nếu bạn đang sử dụng loại được cho biết trong loại người nhận - loại mà bạn đang mở rộng.

Ví dụ, bạn có thể có một phần mở rộng kéo dài T:

val <T: View> T.propName: Unit 
    get() = Unit 

Hoặc một kéo dài một loại sử dụng T như một tham số:

val <T: View> List<T>.propName: Unit 
    get() = Unit 

Còn về lý do này là, tôi nghĩ lý do là một thuộc tính không thể có một tham số kiểu chung chung như một hàm có thể. Trong khi chúng ta có thể gọi một hàm với một tham số kiểu generic ...

val buttons = viewGroup.getViewsOfType<Button>() 

... Tôi không tin một cú pháp tương tự tồn tại đối với tài sản:

val buttons = viewGroup.viewsOfType<Button> // ?? 
+0

Vâng Tôi nghĩ rằng đây là đúng. Trong thực tế khi nghĩ về nó theo cách này, hàm 'getViewOfType' của tôi là vô dụng vì Kotlin đã có cách lọc bộ sưu tập theo kiểu. –

Các vấn đề liên quan