2015-01-29 2 views
5

Следующие обобщения не компилируются. Что здесь семантически неправильно?Общие рамки Kotlin для класса

Вызов функции

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

Метод определения

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

Ошибка компилятора

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 

ответ

4

javaClass устарели. Используйте вместо этого:

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

Использование javaClass<MainActivity>() вместо MainActivity.javaClass

+0

Спасибо, что работал. Какой параметр генетического типа следует использовать, если я хочу перейти в MainActivity.javaClass? –

+0

Если вы имеете в виду аналог Java 'MainActivity.class', тогда используйте' javaClass () 'в Kotlin –

+0

Андрей, это верно. Я хотел спросить, как сменить подпись функции для вышеупомянутого кода для компиляции? –

2

Другого варианта:

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

Мне нравится это лучше, и я собираюсь использовать это +1. Однако ответ Андрея более важен для моего вопроса. –

+0

Да, это правильно. Этот ответ является просто «более приятным» вариантом. – naixx

+0

Действительно это :) –

1

Единственный способ это работает для меня это делает:

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

Ни один из других решений не работали, в том числе использование javaClass

Смежные вопросы