Mic*_*rdo 5 java generics 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;
}
Run Code Online (Sandbox Code Playgroud)
这个类似的(我认为?)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>
}
}
Run Code Online (Sandbox Code Playgroud)
注意:MyActivityComponent实现始终使用Java,以便Dagger可以处理它.
"问题"是Kotlin中的MyActivity.getComponent()需要转换为返回类型,即使是MyActivityComponent子类ActivityComponent.
我对Kotlin的泛型的理解确实很弱,而且我在从Java的泛型转换时遇到了麻烦.有人可以解释为什么这个演员是必要的,或者最好是正确的实施,以消除铸造的需要?
我也尝试过这样的事情:
protected abstract fun <E : Activity> getComponent(context: Context): ActivityComponent<E>
Run Code Online (Sandbox Code Playgroud)
和
protected abstract fun <A: Activity, E : ActivityComponent<A> getComponent(context: Context): E
Run Code Online (Sandbox Code Playgroud)
具有相同的结果(需要铸造).
And*_*lav 14
不同之处在于,在Java中,您使用原始类型ActivityComponent作为返回类型getComponent().原始类型是Java 5中引入的Java遗留机制,主要用于向后兼容Java 4集合.
Kotlin没有原始类型.相反,你可以使用"星形投影",即ActivityComponent<*>模糊地类似于Java ActivityComponent<?>,我建议使用它而不是原始类型.
所以,解决方案是:
fun getComponent(context: Context): ActivityComponent<*>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3482 次 |
| 最近记录: |