2015-01-29 19 views
5

Các generics sau không biên dịch. Cái gì là ngữ nghĩa sai ở đây?Giới hạn chung của Kotlin cho Lớp

Chức năng gọi

start(MainActivity.javaClass) // <== Doesn't compile 

Phương pháp Định nghĩa

// Definition 
public fun <T : Activity> start(activityClass: Class<T>) { 
    startActivity(Intent(this, activityClass)) 
} 

Lỗi trình biên dịch

Error:(43, 9) Type parameter bound for T in fun <T : android.app.Activity> 
start(activityClass: java.lang.Class<T>): kotlin.Unit is not satisfied: 
inferred type com.mobsandgeeks.hellokotlin.MainActivity. 
<class-object-for-MainActivity> is not a subtype of android.app.Activity 

Trả lời

4

javaClass đã bị phản đối. Sử dụng điều này thay vì:

val i = Intent([email protected], Activity::class.java) 
startActivity(i) 
3

Sử dụng javaClass<MainActivity>() thay vì MainActivity.javaClass

+0

Cảm ơn, mà làm việc. Tôi nên sử dụng tham số kiểu di truyền nào nếu tôi muốn truyền trong MainActivity.javaClass? –

+0

Nếu bạn ngụ ý sự tương tự của 'MainActivity.class' của Java, thì hãy sử dụng' javaClass () 'trong Kotlin –

+0

Andrey, đúng vậy. Tôi muốn hỏi, làm thế nào để thay đổi chữ ký chức năng cho mã được đề cập ở trên để biên dịch? –

2

Một lựa chọn khác:

inline public fun <reified T : Activity> start() { 
    startActivity(Intent(this, javaClass<T>())) 
} 
start<MainActivity>() 
+0

Tôi thích điều này tốt hơn và tôi sẽ sử dụng +1 này. Tuy nhiên câu trả lời của Andrey là phù hợp hơn với câu hỏi của tôi. –

+0

Vâng, đúng vậy. Câu trả lời này chỉ là một tùy chọn "đẹp hơn" – naixx

+0

Thực tế nó là :) –

1

Cách duy nhất nó làm việc đối với tôi là làm điều này:

val intent = Intent(this, NextActivity::class.java) 
startActivity(intent) 

Không ai trong số các giải pháp khác đã làm việc, bao gồm cả việc sử dụng javaClass

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