簡體   English   中英

在Kotlin的通用鑄造

[英]Generic casting in Kotlin

我有以下類和接口:

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;
    }

這個類似的(我認為?)Kotlin代碼:

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,以便Dagger可以處理它。

“問題”是Kotlin中的MyActivity.getComponent()需要轉換為返回類型,即使MyActivityComponent ActivityComponent子類。

我對Kotlin的泛型的理解確實很弱,而且我在從Java的泛型轉換時遇到了麻煩。 有人可以解釋為什么這個演員是必要的,或者最好是正確的實施,以消除鑄造的需要?

我也嘗試過這樣的事情:

protected abstract fun <E : Activity> getComponent(context: Context): ActivityComponent<E>

protected abstract fun <A: Activity, E : ActivityComponent<A> getComponent(context: Context): E

具有相同的結果(需要鑄造)。

不同之處在於,在Java中,您使用原始類型ActivityComponent作為getComponent()的返回類型。 原始類型是Java 5中引入的Java遺留機制,主要用於向后兼容Java 4集合。

Kotlin沒有原始類型。 相反,您可以使用“星形投影”,即ActivityComponent<*> ,它與Java的ActivityComponent<?>模糊地類似,我建議使用它而不是原始類型。

所以,解決方案是:

fun getComponent(context: Context): ActivityComponent<*>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM