2015-10-15 18 views
5

Tôi có lớpCách kiểm tra loại generic trong Kotlin?

class Generic<T : SuperType>() 

và mã này is't đúng

fun typeCheck(s: SuperType): Unit { 
      when(s){ 
       is T -> //do some thin 
      } 
     } 

nhưng đúc sTs as T chương trình cảnh báo - diễn viên không an toàn.
Cách kiểm tra xem s có phải là loại T không?

+0

Chuỗi cuối cùng, tại sao bạn sử dụng 'T: String'? –

+0

@cypressious ví dụ của nó – andreich

Trả lời

5

Loại chung không được thống nhất trên JVM khi chạy, do đó không có cách nào để thực hiện việc này trong Kotlin. Cảnh báo là chính xác vì trình biên dịch không thể tạo ra bất kỳ lệnh nào sẽ thất bại khi dàn diễn viên được thực hiện, do đó, bỏ chọn, nghĩa là chương trình có thể hoặc không thể ngắt tại một số điểm sau đó.

Tính năng liên quan có thể sử dụng là reified type parameters trong các hàm nội dòng. Mặc dù vậy, các lớp không thể có các tham số kiểu đã được sửa đổi, vì vậy nếu bạn xây dựng thêm một chút về trường hợp sử dụng của mình, tôi có thể thử giúp bạn đạt được những gì bạn cần.

13

Nếu bạn cần kiểm tra xem có điều gì đó thuộc loại chung chung T bạn cần phải có một phiên bản Class<T> để kiểm tra. Đây là một kỹ thuật phổ biến trong Java hwoever trong Kotlin, chúng ta có thể sử dụng một phương thức nhà máy nội tuyến giúp chúng ta trở thành đối tượng lớp.

class Generic<T : Any>(val klass: Class<T>) { 
    companion object { 
     inline operator fun <reified T : Any>invoke() = Generic(T::class.java) 
    } 

    fun checkType(t: Any) { 
     when { 
      klass.isAssignableFrom(t.javaClass) -> println("Correct type") 
      else -> println("Wrong type") 
     } 

    } 
} 

fun main(vararg args: String) { 
    Generic<String>().checkType("foo") 
    Generic<String>().checkType(1) 
} 
+0

Bạn có thể trả lời cho Câu hỏi của tôi không? https://stackoverflow.com/questions/47418161/kotlin-get-type-of-generic-class-without-instance – murt

+0

mẹo tuyệt vời! bạn có biết cách làm cho nó hoạt động khi lớp 'Generic' trừu tượng không? Vấn đề tôi đang gặp là khởi tạo đối tượng con trên toán tử 'invoke'. – ESala

+0

Điều đó sẽ không hoạt động dễ dàng như vậy. Trình xây dựng lớp con sẽ cần truyền thể hiện 'Lớp' cho siêu khởi tạo. –

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