2015-02-18 3 views
4

У меня есть следующие классы и интерфейсы: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 

С таким же результатом (литье требуется).

+0

была ваша проблема решена ниже ответ? вы искали что-то еще и можете прокомментировать, чтобы мы знали статус? –

ответ

13

Разница в том, что в Java вы используете необработанный тип ActivityComponent в качестве возвращаемого типа для getComponent(). Необработанные типы - это традиционный механизм Java, представленный на Java 5, в основном для обратной совместимости с коллекциями Java 4.

Kotlin не имеет сырых типов. Вместо этого вы можете использовать «звездную проекцию», т. Е. ActivityComponent<*>, которая смутно аналогична Java ActivityComponent<?>, которую я бы рекомендовал использовать вместо необработанного типа.

Таким образом, решение будет:

fun getComponent(context: Context): ActivityComponent<*> 
Смежные вопросы