java - Kotlin 中的通用转换

标签 java generics kotlin

我有以下类和接口(interface):

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() 需要强制转换为返回类型,即使 MyActivityComponentActivityComponent 的子类。

无可否认,我对 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 中您使用的是 raw 类型 ActivityComponent作为 getComponent() 的返回类型.原始类型是 Java 5 中引入的 Java 遗留机制,主要是为了向后兼容 Java 4 集合。

Kotlin 没有原始类型。相反,您可以使用“星形投影”,即 ActivityComponent<*> ,这有点类似于 Java 的 ActivityComponent<?> ,无论如何我都建议使用它来代替原始类型。

所以,解决办法是:

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

关于java - Kotlin 中的通用转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28590885/

相关文章:

java - 我可以在Java中为不同的List<>创建通用构造函数吗?

kotlin - 在 Kotlin 中将变量传递到父级的构造函数中

java - 需要序列计算的算法

java - 如何将字符串类型的值的编码与java中的特定编码进行比较?

java - 泛型方法上的多个通配符使 Java 编译器(和我!)非常困惑

kotlin - kotlin 中 Enum.values() 和 enumValues() 的区别

android - Kotlin RC NoClassDefFoundError

java - 从一百万个单词的列表中获取子字符串的数量

java - 代码中的 SwitchPreference 和 CheckBoxPreference

c# - 在类中存储不同泛型类型的列表