通用对值types的意图额外

很简单的问题:是否有可能find第二对参数(字符串,INT,捆绑等)通用的意图额外types?

inline fun  Context.startActivity(vararg params: Pair) { val intent = Intent(this, T::class.java) params.forEach { intent.putExtra(it.first, it.second) } startActivity(intent) } 

谢谢

我相信这是不可能的与当前的语言function和Android API。

如果你深入到Anko的源头,你会发现最终他们也采取了一些微不足道的方法。 (对于你应该使用的更高级的公共函数,它们使用vararg params: Pair ,然后委托给以下代码。)

 @JvmStatic private fun fillIntentArguments(intent: Intent, params: Array>) { params.forEach { val value = it.second when (value) { null -> intent.putExtra(it.first, null as Serializable?) is Int -> intent.putExtra(it.first, value) is Long -> intent.putExtra(it.first, value) is CharSequence -> intent.putExtra(it.first, value) is String -> intent.putExtra(it.first, value) is Float -> intent.putExtra(it.first, value) is Double -> intent.putExtra(it.first, value) is Char -> intent.putExtra(it.first, value) is Short -> intent.putExtra(it.first, value) is Boolean -> intent.putExtra(it.first, value) is Serializable -> intent.putExtra(it.first, value) is Bundle -> intent.putExtra(it.first, value) is Parcelable -> intent.putExtra(it.first, value) is Array<*> -> when { value.isArrayOf() -> intent.putExtra(it.first, value) value.isArrayOf() -> intent.putExtra(it.first, value) value.isArrayOf() -> intent.putExtra(it.first, value) else -> throw AnkoException("Intent extra ${it.first} has wrong type ${value.javaClass.name}") } is IntArray -> intent.putExtra(it.first, value) is LongArray -> intent.putExtra(it.first, value) is FloatArray -> intent.putExtra(it.first, value) is DoubleArray -> intent.putExtra(it.first, value) is CharArray -> intent.putExtra(it.first, value) is ShortArray -> intent.putExtra(it.first, value) is BooleanArray -> intent.putExtra(it.first, value) else -> throw AnkoException("Intent extra ${it.first} has wrong type ${value.javaClass.name}") } return@forEach } } 

你可以在这里find这个文件: https : //github.com/Kotlin/anko/blob/683115f93ca6b0ed36ab36f3814dbc0da0abe7d3/anko/library/static/common/src/Internals.kt#L143

我不认为这是可能的。 看看putExtra()方法的实现 。

他们不使用多态性来确定要执行的操作的types,您确实需要为第二个参数调用具有正确types签名的方法。