android - 如何使用 Kotlin 在函数中应用多个泛型
问题描述
我正在尝试创建一个函数,该函数将通过解析活动 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 应该是可序列化的类。如果可能的话,您能否解释一下为什么会发生这种情况以及我该如何解决?
解决方案
我不太确定你需要在这里使用泛型。
您应该利用多态性并声明以下内容: 为Activity
类编写扩展方法,因此您不必将任何上下文作为参数传递。通过使用多态性,让类形成一个是 的东西,Activity
给Map
你的是一个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
如下所示:
changeActivity(DetailActivity::class.java, R.anim.someAnim, R.anim.someOtherAnim, mapOf(Pair("first", myFancySerializableObject)))
无论如何,我用来在 Kotlin 中设置泛型的方式如下
fun<T: Activity, U: Serializable> myFancyFunction(firstParam: T, second: U) = Unit
编辑
刚刚测试了代码并尝试调用该函数最终根本无法编译,因为它期望第一个参数恰好是Class
of Activity
。
在这种情况下,您可以这样使用新声明:
fun <A : Activity> Activity.changeActivity(newActivityClass: Class<A>, enteringAnimation: Int, exitingAnimation: Int, extras: Map<String, Serializable>?=null)
或者通过查看Intent
public Intent(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
}
您可以使用 Class<*>
作为第一个参数的类型。根本没有任何泛型。
推荐阅读
- stack - 当我在 textbox1 中写一些东西时,我也想在 textbox 2 中显示相同的文本
- c# - 在 C# 中计算两个日期之间每月的天数
- excel - Excel 前几天的平均值
- python-3.x - 每个客户 ID 的第一个零和“n”的条件,然后获取字母名称并添加到下一列 pandas
- php - 如何在 WooCommerce 中删除“运费已更新”消息
- ios - React Native / App Store Connect:ITMS-90809:不推荐使用的 API
- python - 如何创建一个脚本来自动化另一个脚本?
- javascript - 使用javascript从html表单POST rest api
- docker - Docker:动态创建的文件复制到本地机器
- c - 为什么可以在可重入函数中使用 sig_atomic_t