如何使用Kotlin在函数中应用多个泛型

时间:2019-05-11 15:22:35

标签: android kotlin generic-programming

我正在尝试创建一个函数,该函数将通过分析活动A的上下文和活动B的类来动画化从活动A到活动B的过渡。我意识到有些情况下我想使用序列化来解析信息一项活动的数据类别。所以我创建了以下函数:

fun <T, U> changeActivity(activityAContext : Context, activityB: Class<T>, anim1 : Int, anim2 : Int, extras : Map<String, Class<U>>?=null)
        where T : Activity,
              U : Serializable {
    val activity = activityAContext as Activity
    val intent = Intent(activityAContext , activityB)

    if (extras != null) {

        for ((k, v) in extras) {
            intent.putExtra(k, v)
        }
    }

    activity.overridePendingTransition(anim1, anim2)

    finish()
    startActivity(intent)
}

但是,它不会编译为错误“信息不足以推断参数U”。我不太了解,因为我指定类型U应该是可序列化的类。如果可能的话,请您解释一下为什么会发生这种情况以及我该如何解决?

1 个答案:

答案 0 :(得分:2)

我不太确定您是否需要在此处使用泛型。

您应该利用多态性并声明以下内容:为Activity类编写扩展方法,因此您不必传递任何上下文作为参数。通过使用多态性,让该类成为Activity,而得到的Map是{{1}的Map },String,您将变得更加出色。

Serializable

您现在可以从其他fun Activity.changeActivity(newActivityClass: Class<Activity>, enteringAnimation: Int, exitingAnimation: Int, extras: Map<String, Serializable>?=null) { val intent = Intent(this , newActivityClass) extras?.let { it.forEach{ pair -> intent.putExtra(pair.key, pair.value)} } overridePendingTransition(enteringAnimation, exitingAnimation) finish() startActivity(intent) } 中使用此扩展功能,如下所示:

Activity

无论如何,我用来在Kotlin中设置泛型的方式如下

changeActivity(DetailActivity::class.java, R.anim.someAnim, R.anim.someOtherAnim, mapOf(Pair("first", myFancySerializableObject)))

编辑

仅测试了代码,然后尝试调用该函数最终根本没有编译,因为它希望的第一个参数恰好是fun<T: Activity, U: Serializable> myFancyFunction(firstParam: T, second: U) = Unit 的{​​{1}}。

在这种情况下,您可以这样使用新的声明:

Class

或者通过查看Activity的构造函数

fun <A : Activity> Activity.changeActivity(newActivityClass: Class<A>, enteringAnimation: Int, exitingAnimation: Int, extras: Map<String, Serializable>?=null) 

您可以使用Intent作为第一个参数的类型。根本没有任何泛型。