У меня есть следующие классы и интерфейсы:Generic литье в Котлин
public interface ActivityComponent<T extends Activity> {
void inject(T activity);
}
public interface MyActivityComponent extends ActivityComponent<MyActivity> {
}
public abstract class DaggerActivity extends Activity {
abstract ActivityComponent getComponent(Context context);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityComponent component = getComponent(this);
}
}
public class MyActivity extends DaggerActivity {
@Override
ActivityComponent getComponent(Context context) {
MyActivityComponent component = buildComponent();
return component;
}
И это аналогичное (я думаю?) Котлин код:
public trait ActivityComponent<T : Activity> {
public fun inject(activity: T)
}
public abstract class DaggerActivity : Activity {
protected abstract fun getComponent(context: Context): ActivityComponent<Activity> // Type required
override fun onCreate(savedInstanceState: Bundle?) {
var component = getComponent(this)
}
}
public class MyActivity extends DaggerActivity {
override fun getComponent(context: Context): ActivityComponent<Activity> {
val component: MyActivityComponent = buildComponent()
return component as ActivityComponent<Activity>
}
}
Примечание: MyActivityComponent реализация всегда в Java, так что Кинжал может обработать его.
«Проблема» в том, что MyActivity.getComponent() в Kotlin требует отливки для возвращаемого типа, хотя MyActivityComponent
подклассы ActivityComponent
.
Мое понимание дженериков Котлина, по общему признанию, слабое, и у меня возникают проблемы с переходом от дженериков Java. Может ли кто-нибудь объяснить, почему этот приведение необходим или, желательно, правильная реализация, которая устраняет необходимость в литье?
Я также пытался что-то вроде:
protected abstract fun <E : Activity> getComponent(context: Context): ActivityComponent<E>
и
protected abstract fun <A: Activity, E : ActivityComponent<A> getComponent(context: Context): E
С таким же результатом (литье требуется).
была ваша проблема решена ниже ответ? вы искали что-то еще и можете прокомментировать, чтобы мы знали статус? –