[英]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.